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 限制数字 js限制输入实现代码
Dec 04 Javascript
让复选框只能选择一项的方法
Oct 08 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
Jun 12 Javascript
浅析JavaScript 箭头函数 generator Date JSON
May 23 Javascript
js处理层级数据结构的方法小结
Jan 17 Javascript
Jquery把获取到的input值转换成json
May 15 jQuery
element-ui表格列金额显示两位小数的方法
Aug 24 Javascript
Vue-cli@3.0 插件系统简析
Sep 05 Javascript
VUE基于NUXT的SSR 服务端渲染
Nov 30 Javascript
Node.js事件的正确使用方法
Apr 05 Javascript
微信小程序之 catalog 切换实现解析
Sep 12 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
Dec 30 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
浅析51个PHP处理字符串的函数
2013/08/02 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
PHP自带方法验证邮箱是否存在
2016/02/01 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
简介JavaScript中fixed()方法的使用
2015/06/08 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
2016/05/12 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
JavaScript正则表达式简单实用实例
2017/06/23 Javascript
NodeJS链接MySql数据库的操作方法
2017/06/27 NodeJs
Javascript中parseInt的正确使用方式
2018/10/17 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
详解Next.js页面渲染的优化方案
2019/01/27 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
python OpenCV学习笔记实现二维直方图
2018/02/08 Python
tensorflow 加载部分变量的实例讲解
2018/07/27 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
Django 缓存配置Redis使用详解
2019/07/23 Python
python requests证书问题解决
2019/09/05 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
python+opencv实现移动侦测(帧差法)
2020/03/20 Python
如何用python爬取微博热搜数据并保存
2021/02/20 Python
跑步、骑行和铁人三项的高性能眼镜和服装:ROKA
2018/07/06 全球购物
高中体育教学反思
2014/01/24 职场文书
最新奶茶店创业计划书
2014/01/25 职场文书
七年级生物教学反思
2014/01/30 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
php微信小程序解包过程实例详解
2021/03/31 PHP
Python数据分析之pandas函数详解
2021/04/21 Python