AngularJs Managing Service Dependencies详解


Posted in Javascript onSeptember 02, 2016

angular允许service将其他service声明为依赖,使用在自身实例化时使用的构造函数中。

为了声明依赖,我们需要在工厂方法声明中指定它们,并且在工厂方法中通过$inject属性(字符串标识数组)或者使用array notation。

通常$inject属性声明可以被丢弃(即https://3water.com/article/91815.htm中提到的隐式依赖注入,但这个是实验属性,在而且在压缩混淆后会失效,慎用!)。

使用array notation

function myModuleCfgFn ($provide) {
  $provide.factory(‘myService',[‘dep1','dep2',function(dep1,dep2){}]);
}

使用$inject属性   

function myModuleCfgFn($provide) {
   var myServiceFactory = function(dep1, dep2) {};
   myServiceFactory.$inject = ['dep1', 'dep2'];
   $provide.factory('myService', myServiceFactory);
 }

使用隐式DI(不兼容压缩混淆的代码)

function myModuleCfgFn($provide) {
$provide.factory('myService', function(dep1, dep2) {});
}

       下面有一个例子,里面有两个service,它们之间存在依赖关系,以及其他一些angular提供的service。

/**
 * batchLog service 允许消息在内存中形成队列,50秒flush一次。
 *
 * @param {*} message Message to be logged.
 */
 function batchLogModule($provide){
 $provide.factory('batchLog', ['$timeout', '$log', function($timeout, $log) {
 

var messageQueue = [];
 

function log() {
 


if (messageQueue.length) {
 



$log('batchLog messages: ', messageQueue);
 



messageQueue = [];
 


}
 


$timeout(log, 50000);
 

}
 

log(); 
 

return function(message) {
 


messageQueue.push(message);
 

}
 
}]);
 
/**
 
* routeTemplateMonitor监控每一个route的变化,每个比阿奴啊都会通过batchLog service记录下来
 
*/
 
$provide.factory('routeTemplateMonitor',
 

['$route', 'batchLog', '$rootScope',
 

function($route, batchLog, $rootScope) {
 


$rootScope.$on('$routeChangeSuccess', function() {
 



batchLog($route.current ? $route.current.template : null);
 


});
 
}]);
 }
 // 获得主service,运行应用(监听事件)

angular.injector([batchLogModule]).get('routeTemplateMonitor');

例子中需要注意的事项:

  1. batchLog service依赖angular内置的$timeout(http://docs.angularjs.org/api/ng.$timeout)与$log services(http://docs.angularjs.org/api/ng.$log),实现通过console.log批量log消息。
  2. routeTemplateMonitor service依赖内置的$route(http://docs.angularjs.org/api/ng.$route) service与我们自定义的batchLog service。
  3. 我们两个service都使用工厂方法签名以及array notation来注释inject,声明它们的依赖。array中的字符串标识的顺序与工厂方法签名(参数)中的顺序必须一致,这十分重要。除非在工厂方法参数中使用隐式依赖声明,否则,injector将根据array中字符串的顺序决定inject哪一个服务。

以上就是关于AngularJs Managing Service Dependencies 资料的整理,后续继续添加相关资料,谢谢大家对本站的支持!

Javascript 相关文章推荐
JS 操作符整理[推荐收藏]
Nov 15 Javascript
js导出table到excel同时兼容FF和IE示例
Sep 03 Javascript
jquery的父子兄弟节点查找示例代码
Mar 03 Javascript
微信小程序 教程之小程序配置
Oct 17 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
May 15 jQuery
Vue学习笔记进阶篇之vue-router安装及使用方法
Jul 19 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
Sep 04 Javascript
解决vue热替换失效的根本原因
Sep 19 Javascript
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
Sep 27 Javascript
iview在vue-cli3如何按需加载的方法
Oct 31 Javascript
vue 在单页面应用里使用二级套嵌路由
Dec 19 Vue.js
深入理解Vue的数据响应式
May 15 Vue.js
AngularJs Injecting Services Into Controllers详解
Sep 02 #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
You might like
提高PHP编程效率 引入缓存机制提升性能
2010/02/15 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
Zend Framework开发入门经典教程
2016/03/23 PHP
PHP中的表达式简述
2016/05/29 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
jquery实现浮动的侧栏实例
2015/06/25 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
纯js代码实现简单计算器
2015/12/02 Javascript
JS实现Select的option上下移动的方法
2016/03/01 Javascript
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
AngularJS中的JSONP实例解析
2016/12/01 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
jQuery实现web页面樱花坠落的特效
2017/06/01 jQuery
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
vue路由组件按需加载的几种方法小结
2018/07/12 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
深入理解 Python 中的多线程 新手必看
2016/11/20 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
Django密码存储策略分析
2020/01/09 Python
用python 绘制茎叶图和复合饼图
2021/02/26 Python
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
远程调用的原理
2014/07/05 面试题
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
化学实验员岗位职责
2013/12/28 职场文书
大学生村官典型材料
2014/01/12 职场文书
男方父母证婚词
2014/01/12 职场文书
招标承诺书
2014/08/30 职场文书
童年读书笔记
2015/06/26 职场文书
Oracle用户管理及赋权
2022/04/24 Oracle
Redis基本数据类型String常用操作命令
2022/06/01 Redis