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 相关文章推荐
jQuery.buildFragment使用方法及思路分析
Jan 07 Javascript
鼠标滚轴控制文本框值的JS代码
Nov 19 Javascript
js实现页面跳转重定向的几种方式
May 29 Javascript
js中window.open打开一个新的页面
Aug 10 Javascript
javascript元素动态创建实现方法
May 13 Javascript
Node.js中如何合并两个复杂对象详解
Dec 31 Javascript
Bootstrap实现可折叠分组侧边导航菜单
Mar 07 Javascript
微信小程序 网络通信实现详解
Jul 23 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
Aug 08 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
Nov 14 Javascript
使用vue实现一个电子签名组件的示例代码
Jan 06 Javascript
JS实现无限轮播无倒退效果
Sep 21 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
2006/11/25 PHP
asp和php下textarea提交大量数据发生丢失的解决方法
2008/01/20 PHP
PHP 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
PHP实现域名whois查询的代码(数据源万网、新网)
2010/02/22 PHP
用php来改写404错误页让你的页面更友好
2013/01/24 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
Jquery 的扩展方法总结
2011/10/01 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
node.js中的http.response.getHeader方法使用说明
2014/12/14 Javascript
简单介绍JavaScript的变量和数据类型
2015/06/03 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
全面解析Bootstrap中scrollspy(滚动监听)的使用方法
2016/06/06 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
ionic中列表项增加和删除的实现方法
2017/01/22 Javascript
JavaScript运动框架 多值运动(四)
2017/05/18 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
js实现导航跟随效果
2018/11/17 Javascript
使用Turtle画正螺旋线的方法
2017/09/22 Python
zookeeper python接口实例详解
2018/01/18 Python
python语言中with as的用法使用详解
2018/02/23 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
美国领先的精品家居照明和装饰产品在线零售商:LightsOnline.com
2018/01/23 全球购物
北京SQL新华信咨询
2016/09/30 面试题
What is EJB
2016/07/22 面试题
爸爸的花儿落了教学反思
2014/02/20 职场文书
专题组织生活会方案
2014/06/15 职场文书
校庆标语集锦
2014/06/25 职场文书
安全生产目标管理责任书
2014/07/25 职场文书
2015年人事专员工作总结
2015/04/29 职场文书
离婚被告代理词
2015/05/23 职场文书
副校长2015年教育教学工作总结
2015/07/27 职场文书
python 提取html文本的方法
2021/05/20 Python