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 相关文章推荐
Mootools 1.2教程(2) DOM选择器
Sep 14 Javascript
JavaScript中发布/订阅模式的简单实例
Nov 05 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
Sep 06 Javascript
浅谈String.valueOf()方法的使用
Jun 06 Javascript
性能优化之代码优化页面加载速度
Mar 01 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
Sep 07 Javascript
Javascript中从学习bind到实现bind的过程
Jan 05 Javascript
vue项目打包部署到服务器的方法示例
Aug 27 Javascript
使用nvm和nrm优化node.js工作流的方法
Jan 17 Javascript
Vue 3.x+axios跨域方案的踩坑指南
Jul 04 Javascript
vue单元格多列合并的实现
Nov 26 Vue.js
JS算法教程之字符串去重与字符串反转
Dec 15 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的XML文件解释类应用实例
2014/09/22 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
PHP解压tar.gz格式文件的方法
2016/02/14 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
JQuery在光标位置插入内容的实现代码
2010/06/18 Javascript
用js解决数字不能换行问题
2010/08/10 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
JavaScript实现瀑布流布局
2020/06/28 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
JS对象与json字符串相互转换实现方法示例
2018/06/14 Javascript
Bootstrap模态对话框用法简单示例
2018/08/31 Javascript
css配合JavaScript实现tab标签切换效果
2018/10/11 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
Python检测一个对象是否为字符串类的方法
2015/05/21 Python
Python实现命令行通讯录实例教程
2016/08/18 Python
Python遍历pandas数据方法总结
2018/02/09 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
Python遍历字典方式就实例详解
2019/12/28 Python
来自世界上最好大学的在线课程:edX
2018/10/16 全球购物
钳工实习自我鉴定
2013/09/19 职场文书
我的老师教学反思
2014/05/01 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
正科级干部考察材料
2014/05/29 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
会议承办单位欢迎词
2015/09/30 职场文书
小组组名及励志口号
2015/12/24 职场文书
MySQL表的增删改查基础教程
2021/04/07 MySQL
SQL 聚合、分组和排序
2021/11/11 MySQL