AngularJs Injecting Services Into Controllers详解


Posted in Javascript onSeptember 02, 2016

     把service当作被依赖的资源加载到controller中的方法,与加载到其他服务中的方法很相似。

由于javascript是一个动态语言,DI不能弄明白应该通过static types(like in static typed languages)注入哪一个service。因此,我们需要通过$inject属性指定service名称, 它是一个包含需要注入的service名称的字符串数组。service ID顺序的重要性:工厂方法中的参数顺序,与service在数组中的顺序一致。工厂方法的参数名称并不重要,但是按照惯常的做法,他们与service ID一一匹配,下面将讨论这样做的好处。

1.显式依赖注入

function myController($scope,$loc,$log) {
$scope.firstMethod = function() {
  
//使用$location service
    $loc.setHash();
  };

$scope.secondMethod = function() {
    //使用$log service
    $log.info(‘…')

};
}
myController.$inject = [‘$location','$log'];

例子:

<!DOCTYPE HTML>
<html lang="zh-cn" ng-app="MainApp">
<head>
  <meta charset="UTF-8">
  <title>explicit-inject-service</title>
</head>
<body>
<div ng-controller="MyController">
  <input type="text" ng-model="msg"/>
  <button ng-click="saveMsg()">save msg</button>
  <ul>
    <li ng-repeat="msg in msgs">{{msg}}</li>
  </ul>
</div>
<script src="../angular-1.0.1.js" type="text/javascript"></script>
<script type="text/javascript">
  var app = angular.module("MainApp",[],function($provide) {
    $provide.factory("notify",["$window","$timeout",function(win,timeout) {
      //这里是服务依赖服务,通过这种显式的方式,参数名可以乱填,但顺序要对应
      var msgs = [];
      return function(msg) {
        msgs.push(msg);
        if(msgs.length==3) {
          timeout(function() {
            win.alert(msgs.join("\n"));
            msgs = [];
          },10);
        }
      }
    }]);
  });

  function MyController($s,$noti) {
    //这里是controller依赖服务,通过这种显式的方式,参数名可以乱填,但顺序要对应
    $s.msgs = [];
    $s.saveMsg = function() {
      this.msgs.push(this.msg);
      $noti(this.msg);
      this.msg = "";
    };
  }
  //指定注入的东东
  //也可以参考http://www.cnblogs.com/lcllao/archive/2012/10/16/2725317.html里面的例子
  MyController.$inject = ['$scope','notify'];

</script>
</body>
</html>

 2. 隐式依赖注入

 angular DI的一个新特性,允许通过参数名称决定依赖。让我们重写上面的例子,展示如何隐式注入$window、$scope与notify service。

例子:

<!DOCTYPE HTML>
<html lang="zh-cn" ng-app="MainApp">
<head>
  <meta charset="UTF-8">
  <title>implicit-inject-service</title>
</head>
<body>
<div ng-controller="MyController">
  <input type="text" ng-model="msg"/>
  <button ng-click="saveMsg()">save msg</button>
  <ul>
    <li ng-repeat="msg in msgs">{{msg}}</li>
  </ul>
</div>
<script src="../angular-1.0.1.js" type="text/javascript"></script>
<script type="text/javascript">
  var app = angular.module("MainApp",[],function($provide) {
    $provide.factory("notify",function($window,$timeout) {
      //服务依赖服务,隐式依赖,名称一致即可
      var msgs = [];
      return function(msg) {
        msgs.push(msg);
        if(msgs.length==3) {
          $timeout(function() {
            $window.alert(msgs.join("\n"));
            msgs = [];
          },10);
        }
      }
    });
  });

  function MyController($scope,notify) {
    //服务依赖服务,隐式依赖,名称一致即可
    $scope.msgs = [];
    $scope.saveMsg = function() {
      this.msgs.push(this.msg);
      notify(this.msg);
      this.msg = "";
    };
  }
</script>
</body>
</html>
 

虽然这样很方便,但是假如我们需要压缩、混淆我们的代码,这可能会导致参数名称被更改,遇到这种情况的时候,我们还是需要使用显式声明依赖的方式。

以上就是关于AngularJS Injecting Services Into Controllers的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

Javascript 相关文章推荐
推荐 21 款优秀的高性能 Node.js 开发框架
Aug 18 Javascript
js中键盘事件实例简析
Jan 10 Javascript
js实现Select列表各项上移和下移的方法
Aug 14 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
Aug 21 Javascript
jQuery操作cookie
Aug 08 Javascript
JavaScript中数组Array方法详解
Feb 27 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
Mar 01 Javascript
原生JS实现圣旨卷轴展开效果
Mar 06 Javascript
用Cordova打包Vue项目的方法步骤
Feb 02 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
May 23 jQuery
JS实现进度条动态加载特效
Mar 25 Javascript
解决VUEX的mapState/...mapState等取值问题
Jul 24 Javascript
AngularJs  Creating Services详解及示例代码
Sep 02 #Javascript
利用jQuery实现打字机字幕效果实例代码
Sep 02 #Javascript
AngularJs  Using $location详解及示例代码
Sep 02 #Javascript
基于JS实现类似支付宝支付密码输入框
Sep 02 #Javascript
JavaScript中Number对象的toFixed() 方法详解
Sep 02 #Javascript
Node.js实现兼容IE789的文件上传进度条
Sep 02 #Javascript
AngularJs  Understanding Angular Templates
Sep 02 #Javascript
You might like
php 求质素(素数) 的实现代码
2011/04/12 PHP
使用PHP编写发红包程序
2015/07/22 PHP
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
2016/10/12 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
Vue项目中添加锁屏功能实现思路
2018/06/29 Javascript
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
2018/11/15 Javascript
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
Python中动态创建类实例的方法
2017/03/24 Python
Django中针对基于类的视图添加csrf_exempt实例代码
2018/02/11 Python
Python针对给定列表中元素进行翻转操作的方法分析
2018/04/27 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
Linux下多个Python版本安装教程
2018/08/15 Python
使用Py2Exe for Python3创建自己的exe程序示例
2018/10/31 Python
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
解析python的局部变量和全局变量
2019/08/15 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
python中rc1什么意思
2020/06/19 Python
python多线程semaphore实现线程数控制的示例
2020/08/10 Python
THE OUTNET美国官网:国际设计师品牌折扣网站
2017/03/07 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
代理协议书范本
2014/04/22 职场文书
课程设计的心得体会
2014/09/03 职场文书
夫妻婚内购房协议书
2014/10/05 职场文书
2015大学生求职信范文
2015/03/20 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
奖学金发言稿(范文)
2019/08/21 职场文书