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 相关文章推荐
Array.prototype.slice.apply的使用方法
Mar 17 Javascript
解析Javascript中难以理解的11个问题
Dec 09 Javascript
用js替换除数字与逗号以外的所有字符的代码
Jun 07 Javascript
javascript中基本类型和引用类型的区别分析
May 12 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
May 03 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
Dec 08 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
Jan 16 Javascript
jQuery Collapse1.1.0折叠插件简单使用
Aug 28 jQuery
vue3.0 CLI - 2.5 - 了解组件的三维
Sep 14 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
Nov 05 Javascript
JavaScript静态作用域和动态作用域实例详解
Jun 17 Javascript
微信公众号开发之微信支付代码记录的实现
Oct 16 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在window iis的莫名问题的测试方法
2013/05/14 PHP
PHP设置图片文件上传大小的具体实现方法
2013/10/11 PHP
php基于mcrypt的加密解密实例
2014/10/27 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
解决Yii2邮件发送结果返回成功,但接收不到邮件的问题
2017/05/23 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
js 页面输出值
2008/11/30 Javascript
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
2010/10/18 Javascript
javascript中window.event事件用法详解
2012/12/11 Javascript
jquery实现按Enter键触发事件示例
2013/09/10 Javascript
jquery遍历数组与筛选数组的方法
2013/11/05 Javascript
jquery获取及设置outerhtml的方法
2015/03/09 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
js获取元素下的第一级子元素的方法(推荐)
2017/03/05 Javascript
js实现本地图片文件拖拽效果
2017/07/18 Javascript
jQuery表单校验插件validator使用方法详解
2020/02/18 jQuery
[02:42]DOTA2英雄基础教程 杰奇洛
2013/12/23 DOTA
python list中append()与extend()用法分享
2013/03/24 Python
Python实现抓取网页并且解析的实例
2014/09/20 Python
Python实现新浪博客备份的方法
2016/04/27 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
PyQt5响应回车事件的方法
2019/06/25 Python
Python有参函数使用代码实例
2020/01/06 Python
Python JSON编解码方式原理详解
2020/01/20 Python
python如何实现递归转非递归
2021/02/25 Python
商务专员岗位职责
2013/11/23 职场文书
试用期自我鉴定范文
2014/03/20 职场文书
运动会口号16字
2014/06/07 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
Oracle锁表解决方法的详细记录
2022/06/05 Oracle
SQL Server2019安装的详细步骤实战记录(亲测可用)
2022/06/10 SQL Server