AngularJS $injector 依赖注入详解


Posted in Javascript onSeptember 14, 2016

推断式注入

这种注入方式,需要在保证参数名称与服务名称相同。如果代码要经过压缩等操作,就会导致注入失败。

app.controller("myCtrl1", function($scope,hello1,hello2){
    $scope.hello = function(){
      hello1.hello();
      hello2.hello();
    }
  });

标记式注入

这种注入方式,需要设置一个依赖数组,数组内是依赖的服务名字,在函数参数中,可以随意设置参数名称,但是必须保证顺序的一致性。

var myCtrl2 = function($scope,hello1,hello2){
    $scope.hello = function(){
      hello1.hello();
      hello2.hello();
    }
  }
  myCtrl2.$injector = ['hello1','hello2'];
  app.controller("myCtrl2", myCtrl2);

内联式注入

这种注入方式直接传入两个参数,一个是名字,另一个是一个数组。这个数组的最后一个参数是真正的方法体,其他的都是依赖的目标,但是要保证与方法体的参数顺序一致(与标记注入一样)。

app.controller("myCtrl3",['$scope','hello1','hello2',function($scope,hello1,hello2){
    $scope.hello = function(){
      hello1.hello();
      hello2.hello();
    }
  }]);

$injector常用的方法

在angular中,可以通过angular.injector()获得注入器。

var $injector = angular.injector();

通过$injector.get('serviceName')获得依赖的服务名字

$injector.get('$scope')

通过$injector.annotate('xxx')获得xxx的所有依赖项

$injector.annotate(xxx)

样例代码

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <script src="http://apps.bdimg.com/libs/angular.js/1.2.16/angular.min.js"></script>
</head>
<body ng-app="myApp">
  <div ng-controller="myCtrl1">
    <input type="button" ng-click="hello()" value="ctrl1"></input>
  </div>
  <div ng-controller="myCtrl2">
    <input type="button" ng-click="hello()" value="ctrl2"></input>
  </div>
  <div ng-controller="myCtrl3">
    <input type="button" ng-click="hello()" value="ctrl3"></input>
  </div>
  <script type="text/javascript">
  var app = angular.module("myApp",[]);
  app.factory("hello1",function(){
    return {
      hello:function(){
        console.log("hello1 service");
      }
    }
  });
  app.factory("hello2",function(){
    return {
      hello:function(){
        console.log("hello2 service");
      }
    }
  });

  var $injector = angular.injector();
  console.log(angular.equals($injector.get('$injector'),$injector));//true
  console.log(angular.equals($injector.invoke(function($injector) {return $injector;}),$injector));//true

  //inferred
  // $injector.invoke(function(serviceA){});
  app.controller("myCtrl1", function($scope,hello1,hello2){
    $scope.hello = function(){
      hello1.hello();
      hello2.hello();
    }
  });

  //annotated
  // function explicit(serviceA) {};
  // explicit.$inject = ['serviceA'];
  // $injector.invoke(explicit);
  var myCtrl2 = function($scope,hello1,hello2){
    $scope.hello = function(){
      hello1.hello();
      hello2.hello();
    }
  }
  myCtrl2.$injector = ['hello1','hello2'];
  app.controller("myCtrl2", myCtrl2);

  //inline
  app.controller("myCtrl3",['$scope','hello1','hello2',function($scope,hello1,hello2){
  // app.controller("myCtrl3",['$scope','hello1','hello2',function(a,b,c){
    // a.hello = function(){
    // b.hello();
    // c.hello();
    // }
    $scope.hello = function(){
      hello1.hello();
      hello2.hello();
    }
  }]);

  console.log($injector.annotate(myCtrl2));//["$scope","hello1","hello2"]
  </script>
</body>
</html>

以上就是对AngularJS injector的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

Javascript 相关文章推荐
JS维吉尼亚密码算法实现代码
Nov 09 Javascript
js修改table中Td的值(定义td的单击事件)
Jan 10 Javascript
JavaScript实现获取dom中class的方法
Feb 09 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
Jul 08 Javascript
AngularJS基础 ng-include 指令示例讲解
Aug 01 Javascript
微信小程序 火车票查询实例讲解
Oct 17 Javascript
微信小程序 swiper组件轮播图详解及实例
Nov 16 Javascript
JS和canvas实现俄罗斯方块
Mar 14 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
Sep 22 Javascript
JS闭包原理与应用经典示例
Dec 20 Javascript
jQuery弹框插件使用方法详解
May 26 jQuery
AudioContext 实现音频可视化(web技术分享)
Feb 24 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
Sep 14 #Javascript
详解XMLHttpRequest(一)同步请求和异步请求
Sep 14 #Javascript
AngularJs ng-route路由详解及实例代码
Sep 14 #Javascript
js实现文字截断功能
Sep 14 #Javascript
jQuery版AJAX简易封装代码
Sep 14 #Javascript
原生JS实现首页进度加载动画
Sep 14 #Javascript
jquery判断iPhone、Android设备类型
Sep 14 #Javascript
You might like
解析php防止form重复提交的方法
2013/07/01 PHP
通过php删除xml文档内容的方法
2015/01/23 PHP
php实现修改新闻时删除图片的方法
2015/05/12 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
2013/12/24 Javascript
Javascript编写2048小游戏
2015/07/07 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
JS高级运动实例分析
2016/12/20 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
实例讲解Vue.js中router传参
2018/04/22 Javascript
Element-UI中关于table表格的那些骚操作(小结)
2019/08/15 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
Python实现通讯录功能
2018/02/22 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
python读取文件名并改名字的实例
2019/01/07 Python
django admin组件使用方法详解
2019/07/19 Python
python中open函数的基本用法示例
2019/09/07 Python
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
Tod’s英国官方网站:意大利奢华手工制作手袋和鞋履
2019/03/15 全球购物
一道SQL面试题
2012/12/31 面试题
啤酒销售实习自我鉴定
2013/09/24 职场文书
社会实践的活动方案
2014/08/22 职场文书
学校运动会广播稿100条
2014/09/14 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
Oracle 多表查询基本语法实例
2022/04/18 Oracle
java中如何截取字符串最后一位
2022/07/07 Java/Android