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 轻松搞定快捷留言功能 只需一行代码
Apr 01 Javascript
基于JQuery的数字改变的动画效果--可用来做计数器
Aug 11 Javascript
JavaScript 学习历程和心得分享
Dec 12 Javascript
javascript将url中的参数加密解密代码
Nov 17 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
Mar 01 Javascript
深入解析Backbone.js框架的依赖库Underscore.js的作用
May 07 Javascript
Java  Spring 事务回滚详解
Oct 17 Javascript
简单实现JS计算器功能
Dec 21 Javascript
了解JavaScript函数中的默认参数
May 30 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
Feb 10 Javascript
JavaScript或jQuery 获取option value值方法解析
May 12 jQuery
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 Vue.js
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中使用redis
2013/11/04 PHP
解析WordPress中函数钩子hook的作用及基本用法
2015/12/22 PHP
jQuery Ajax 全解析
2009/02/08 Javascript
通过JQuery实现win8一样酷炫的动态磁贴效果(示例代码)
2013/07/13 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
jquery仿搜索自动联想功能代码
2014/05/23 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
2016/05/25 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
jQuery简单获取DIV和A标签元素位置的方法
2017/02/07 Javascript
JS模拟实现ECMAScript5新增的数组方法
2017/03/20 Javascript
bootstrap弹出层的多种触发方式
2017/05/10 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
JSONObject与JSONArray使用方法解析
2020/09/28 Javascript
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
pycham查看程序执行的时间方法
2018/11/29 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
python 经典数字滤波实例
2019/12/16 Python
python excel和yaml文件的读取封装
2021/01/12 Python
Python爬虫入门教程02之笔趣阁小说爬取
2021/01/24 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
美国滑雪和滑雪板商店:Buckman
2018/03/03 全球购物
枚举与#define宏的区别
2014/04/30 面试题
介绍一下linux文件系统分配策略
2013/02/25 面试题
国际经济贸易专业推荐信
2013/11/06 职场文书
技校毕业生自荐信范文
2014/03/07 职场文书
妇女儿童发展规划实施方案
2014/03/16 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
2015年社区妇联工作总结
2015/04/21 职场文书
期中考试后的感想
2015/08/07 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang