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 26 Javascript
javascript 处理事件绑定的一些兼容写法
Dec 24 Javascript
Jvascript学习实践案例(开发常用)
Jun 25 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
Dec 13 Javascript
从数组中随机取x条不重复数据的JS代码
Dec 24 Javascript
jquery模拟实现鼠标指针停止运动事件
Jan 12 Javascript
vue,angular,avalon这三种MVVM框架优缺点
Apr 27 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
Jun 03 Javascript
VueJS实现用户管理系统
May 29 Javascript
Vue实现购物车基本功能
Nov 08 Javascript
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
Dec 04 Vue.js
基于vue+echarts数据可视化大屏展示的实现
Dec 25 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
全国FM电台频率大全 - 22 重庆市
2020/03/11 无线电
PHP 编程的 5个良好习惯
2009/02/20 PHP
php处理json时中文问题的解决方法
2011/04/12 PHP
PHP 获取指定地区的天气实例代码
2017/02/08 PHP
BOOM vs RR BO5 第一场 2.14
2021/03/10 DOTA
js原型继承的两种方法对比介绍
2014/03/30 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
JQuery动画与特效实例分析
2015/02/02 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
html5+javascript实现简单上传的注意细节
2016/04/18 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
JQuery form表单提交前验证单选框是否选中、删除记录时验证经验总结(整理)
2017/06/09 jQuery
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
JQuery Ajax执行跨域请求数据的解决方案
2018/12/10 jQuery
ES6入门教程之Array.from()方法
2019/03/23 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
javascript面向对象三大特征之多态实例详解
2019/07/24 Javascript
JavaScript oncopy事件用法实例解析
2020/05/13 Javascript
jquery实现简单拖拽效果
2020/07/20 jQuery
vue集成openlayers加载geojson并实现点击弹窗教程
2020/09/24 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
wxpython中自定义事件的实现与使用方法分析
2016/07/21 Python
python实现解数独程序代码
2017/04/12 Python
Python实现的中国剩余定理算法示例
2017/08/05 Python
python回调函数中使用多线程的方法
2017/12/25 Python
python使用jieba实现中文分词去停用词方法示例
2018/03/11 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
Python CSS选择器爬取京东网商品信息过程解析
2020/06/01 Python
德国团购网站:Groupon德国
2018/03/13 全球购物
工程承诺书怎么写
2014/05/24 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
vue 自定义的组件绑定点击事件
2022/04/21 Vue.js