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 EasyUI API 中文文档 - Menu菜单
Oct 03 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
Feb 01 Javascript
jquery选择符快速提取web表单数据示例
Mar 27 Javascript
javascript中动态函数用法实例分析
May 14 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
Nov 18 Javascript
jquery日历插件datepicker用法分析
Jan 22 Javascript
利用jquery制作滚动到指定位置触发动画
Mar 26 Javascript
layer实现弹窗提交信息
Dec 12 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
Dec 20 Javascript
使用微信小程序开发弹出框应用实例详解
Oct 18 Javascript
Vue实现简易翻页效果源码分享
Nov 08 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
Apr 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动态变静态原理
2006/11/25 PHP
PHP新手用的Insert和Update语句构造类
2012/03/31 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
2015/03/04 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
Javascript 布尔型分析
2008/12/22 Javascript
JavaScript中__proto__与prototype的关系深入理解
2012/12/04 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
JavaScript操作Cookie详解
2015/02/28 Javascript
Vue利用canvas实现移动端手写板的方法
2018/05/03 Javascript
详解Vue.js v-for不支持IE9的解决方法
2018/12/29 Javascript
详解vue中axios的使用与封装
2019/03/20 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
python复制文件代码实现
2013/12/23 Python
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
护理专业毕业生自荐信范文
2014/01/05 职场文书
优秀食品类广告词
2014/03/19 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
优秀少先队工作者事迹材料
2014/05/13 职场文书
公司股东合作协议书
2014/09/14 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
委托培训协议书
2014/11/17 职场文书
实习单位推荐信
2015/03/27 职场文书
六一文艺汇演主持词
2015/06/30 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
Java的Object类的九种方法
2022/04/13 Java/Android
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers