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 相关文章推荐
Jquery实现显示和隐藏的4种简单方式
Aug 28 Javascript
javascript自然分类法算法实现代码
Oct 11 Javascript
js用正则表达式来验证表单(比较齐全的资源)
Nov 17 Javascript
一个不错的仿携程自定义数据下拉选择select
Sep 01 Javascript
jQuery遍历对象、数组、集合实例
Nov 08 Javascript
利用JavaScript判断浏览器类型及版本
Aug 23 Javascript
AngularJS中watch监听用法分析
Nov 04 Javascript
js实现瀑布流效果(自动生成新的内容)
Mar 16 Javascript
详解vue.js的事件处理器v-on:click
Jun 27 Javascript
vue.js的computed,filter,get,set的用法及区别详解
Mar 08 Javascript
JS实现生成由字母与数字组合的随机字符串功能详解
May 25 Javascript
微信小程序实现左滑动删除效果
Mar 30 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 删除数组元素
2009/01/16 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
CI映射(加载)数据到view层的方法
2016/03/28 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
splice slice区别
2006/10/09 Javascript
SWFObject Flash js调用类
2008/07/08 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
element ui 对话框el-dialog关闭事件详解
2018/02/26 Javascript
jQuery实现checkbox全选功能完整实例
2018/07/12 jQuery
在iFrame子页面里实现模态框的方法
2018/08/17 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
原生js实现抽奖小游戏
2019/06/27 Javascript
python的迭代器与生成器实例详解
2014/07/16 Python
python进阶教程之循环对象
2014/08/30 Python
python使用adbapi实现MySQL数据库的异步存储
2019/03/19 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
Python Django基础二之URL路由系统
2019/07/18 Python
Python读取表格类型文件代码实例
2020/02/17 Python
pytorch ImageFolder的覆写实例
2020/02/20 Python
全球知名旅游社区巴西站点:TripAdvisor巴西
2016/07/21 全球购物
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
HashMap和Hashtable的区别
2013/05/18 面试题
党员年终民主评议的自我评价
2013/11/05 职场文书
企事业单位求职者的自我评价
2013/12/28 职场文书
高三地理教学反思
2014/01/11 职场文书
给老师的检讨书
2014/02/11 职场文书
大学生全国两会报告感想
2014/03/17 职场文书
药剂专业自荐信范文
2014/04/16 职场文书
质量负责人任命书
2014/06/06 职场文书
产品调价通知函
2015/04/20 职场文书
2015大学迎新标语
2015/07/16 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python