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鼠标悬停特效具体方法
Jun 17 Javascript
js判断上传文件的类型和大小示例代码
Oct 18 Javascript
ie中js创建checkbox默认选中问题探讨
Oct 21 Javascript
js设置function参数默认值(适合没有传参情况)
Feb 24 Javascript
js面向对象编程之如何实现方法重载
Jul 02 Javascript
jquery实现网页的页面平滑滚动效果代码
Nov 02 Javascript
jquery实现图片预加载
Dec 25 Javascript
Node.js使用Express创建Web项目详细教程
Mar 31 Javascript
React-intl 实现多语言的示例代码
Nov 03 Javascript
微信小程序实现多选删除列表数据功能示例
Jan 15 Javascript
详解微信小程序用定时器实现倒计时效果
Apr 30 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
Nov 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
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
jQuery阻止事件冒泡具体实现
2013/10/11 Javascript
jquery遍历checkbox的注意事项说明
2014/02/21 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
JS解析XML实例分析
2015/01/30 Javascript
推荐10 个很棒的 jQuery 特效代码
2015/10/04 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
Javascript创建类和对象详解
2017/05/31 Javascript
vue的diff算法知识点总结
2018/03/29 Javascript
vue cli使用融云实现聊天功能的实例代码
2019/04/19 Javascript
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
基于python实现微信模板消息
2015/12/21 Python
浅谈python中copy和deepcopy中的区别
2017/10/23 Python
Python日期格式和字符串格式相互转换的方法
2020/02/18 Python
如何用 Python 制作一个迷宫游戏
2021/02/25 Python
IE兼容css3圆角的实现代码
2011/07/21 HTML / CSS
浅谈html5 响应式布局
2014/12/24 HTML / CSS
日语系毕业生推荐信
2013/11/11 职场文书
护士辞职信范文
2014/01/19 职场文书
访谈节目策划方案
2014/05/15 职场文书
计生工作先进事迹
2014/08/15 职场文书
党员自我评议对照检查材料
2014/09/27 职场文书
停发工资证明范本
2015/06/12 职场文书
催款函怎么写
2015/06/24 职场文书
推广普通话的宣传语
2015/07/13 职场文书
2016年五一促销广告语
2016/01/28 职场文书
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis