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 相关文章推荐
JavaScript国旗变换效果代码
Aug 13 Javascript
jQuery查询数据返回object和字符串影响原因是什么
Aug 09 Javascript
java与javascript之间json格式数据互转介绍
Oct 29 Javascript
JS保留两位小数 四舍五入函数的小例子
Nov 20 Javascript
js 动态加载事件的几种方法总结
Dec 25 Javascript
javascript 3d 逐侦产品展示(核心精简)
Mar 26 Javascript
Angular 应用技巧总结
Sep 14 Javascript
微信小程序中button组件的边框设置的实例详解
Sep 27 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
Dec 28 Javascript
vue 父组件调用子组件方法及事件
Mar 29 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
Sep 20 Javascript
Node.js API详解之 zlib模块用法分析
May 19 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代码审计比较有意思的例子
2014/05/07 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
PHP定时执行任务的3种方法详解
2015/12/21 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
Laravel如何实现适合Api的异常处理响应格式
2020/06/14 PHP
javascript获得CheckBoxList选中的数量
2009/10/27 Javascript
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
node.js 使用ejs模板引擎时后缀换成.html
2015/04/22 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
JS DOM实现鼠标滑动图片效果
2020/09/17 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
JS匿名函数实例分析
2016/11/26 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
[04:03]DOTA2英雄梦之声_第02期_风暴之灵
2014/06/30 DOTA
Python实现子类调用父类的方法
2014/11/10 Python
Python实现单词翻译功能
2017/06/06 Python
Python学习之Anaconda的使用与配置方法
2018/01/04 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
党校培训自我鉴定
2014/02/01 职场文书
2014年初级职称工作总结
2014/12/08 职场文书
Golang Gob编码(gob包的使用详解)
2021/05/07 Golang
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers