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 相关文章推荐
JS打开图片另存为对话框实现代码
Dec 26 Javascript
jquery实现按Enter键触发事件示例
Sep 10 Javascript
JS动态改变浏览器标题的方法
Apr 06 Javascript
jQuery模仿京东/天猫商品左侧分类导航菜单效果
Jun 29 Javascript
微信小程序微信支付接入开发实例详解
Apr 12 Javascript
Vue的MVVM实现方法
Aug 16 Javascript
JavaScript登录验证基础教程
Nov 01 Javascript
js中的闭包学习心得
Feb 06 Javascript
关于jquery中attr()和prop()方法的区别
May 28 jQuery
JavaScript实现的简单加密解密操作示例
Jun 01 Javascript
快速解决处理后台返回json数据格式的问题
Aug 07 Javascript
js实现时钟定时器
Mar 26 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 UTF-8、Unicode和BOM问题
2010/05/18 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
php替换字符串中间字符为省略号的方法
2015/05/04 PHP
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
Yii中特殊行为ActionFilter的使用方法示例
2020/10/18 PHP
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
一款js和css代码压缩工具[附JAVA环境配置方法]
2010/04/16 Javascript
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
nodejs实现获取某宝商品分类
2015/05/28 NodeJs
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
php简单数据库操作类的封装
2017/06/08 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
2017/07/26 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
[01:01]2020完美高校联赛(秋)西安落幕
2021/03/11 DOTA
Numpy之random函数使用学习
2019/01/29 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
python 读取、写入txt文件的示例
2020/09/27 Python
西班牙电子产品购物网站:Electronicamente
2018/07/26 全球购物
大学班长的职责
2014/01/27 职场文书
保护环境倡议书300字
2014/05/19 职场文书
暑期学习心得体会
2014/09/02 职场文书
Golang实现AES对称加密的过程详解
2021/05/20 Golang
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
详解Go语言中Get/Post请求测试
2022/06/01 Golang