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 相关文章推荐
常用参考资料(手册)下载或者链接
Jul 22 Javascript
在b/s开发中经常用到的javaScript技术
Aug 23 Javascript
jquery1.4 教程二 ajax方法的改进
Feb 25 Javascript
js/jquery去掉空格,回车,换行示例代码
Nov 05 Javascript
浅析js设置控件的readonly与enabled属性问题
Dec 25 Javascript
关于vue.js弹窗组件的知识点总结
Sep 11 Javascript
详谈js中数组(array)和对象(object)的区别
Feb 27 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
Mar 31 Javascript
解决Extjs下拉框不显示的问题
Jun 21 Javascript
vue组件详解之使用slot分发内容
Apr 09 Javascript
vue.js2.0 实现better-scroll的滚动效果实例详解
Aug 13 Javascript
微信小程序发送短信验证码完整实例
Jan 07 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
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
教你如何开启shopnc b2b2c 伪静态
2014/10/21 PHP
两款万能的php分页类
2015/11/12 PHP
php支付宝APP支付功能
2020/07/29 PHP
基于jQuery的日期选择控件
2009/10/27 Javascript
javascript 二维数组的实现与应用
2010/03/16 Javascript
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
js格式化时间小结
2014/11/03 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
深入理解js generator数据类型
2016/08/16 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
2017/07/20 Python
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
Python找出最小的K个数实例代码
2018/01/04 Python
对numpy 数组和矩阵的乘法的进一步理解
2018/04/04 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
解决pycharm修改代码后第一次运行不生效的问题
2021/02/06 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
公司业务主管岗位职责
2013/12/07 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
梅花魂教学反思
2014/04/25 职场文书
感恩教育活动总结
2014/05/05 职场文书
知识竞赛拉拉队口号
2014/06/16 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
2021/05/25 Python
Python Matplotlib绘制条形图的全过程
2021/10/24 Python
python代码实现扫码关注公众号登录的实战
2021/11/01 Python
NodeJs使用webpack打包项目的方法详解
2022/02/28 NodeJs
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python
python实现一个简单的贪吃蛇游戏附代码
2022/06/28 Python