Angular.js中的$injector服务
一 、angular中的依赖注入
angular的一个很重要的特性就是依赖注入,可以分开理解这4个字。
1.依赖:
angular里面的依赖,有angular默认提供的,也有我们自己添加的。默认提供的比如$rootScope,$http,$injector等,我们也可以自己写factory函数来添加自己的依赖对象。
2.注入:
想要在当前上下文中使用已有的依赖,就必须通过$injector服务来获得依赖对象。
二、在一无所有的情况下获得$injector服务
$injector本身也是依赖之一,怎么样一无所有的情况下得到$injector呢?angular框架提供了angular.injector()全局函数。
这个函数接受modules数组作为它的参数,之后它就可以获得这些modules里面注册的各种服务了。特别是ng module,它是angular提供给我们的基础模块,$inject,$rootscope,$http等很多大家熟悉的服务都在ng module里面定义的。
看看下面代码:
<!doctype html>
<html>
<head>
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
<script>
var $injector=angular.injector(['ng']);
var $log=$injector.get('$log');
$log.log('hello world!');
</script>
</head>
<body>
</body>
</html>
大家发现这里没有ng-app属性,也没有angular.bootstrap()函数,但是我们得到了angularjs里面的$log服务。
三、angular启动过程中的$injector
在angular.bootstrap()函数里和$injector有关系的语句如下:
modules = modules || [];
modules.unshift(['$provide', function($provide) {
$provide.value('$rootElement', element);
}]);
modules.unshift('ng');
var injector = createInjector(modules, config.strictDi);
injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector',
function bootstrapApply(scope, element, compile, injector) {
scope.$apply(function() {
element.data('$injector', injector);
compile(element)(scope);
});
}]
这里的代码说明了angular启动过程中和我们前面的代码做了差不多的事情。
四、$injector和单元测试
我们平时写angular程序的时候$injector用处可能不是很大,毕竟controller等函数都在暗中帮我们把注入做好了。但是在写单元测试的时候,就不得不用到$injector了。
!doctype html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="//cdn.bootcss.com/jasmine/2.4.1/jasmine.css">
<script src="//cdn.bootcss.com/jasmine/2.4.1/jasmine.js"></script>
<script src="//cdn.bootcss.com/jasmine/2.4.1/jasmine-html.js"></script>
<script src="//cdn.bootcss.com/jasmine/2.4.1/boot.js"></script>
<script src="//cdn.bootcss.com/angular.js/1.4.8/angular.js"></script>
<script src="//cdn.bootcss.com/angular.js/1.4.8/angular-mocks.js"></script>
</head>
<body>
<script>
angular.module('myModule', [])
.factory('myLog', ['$log', function ($log) { return {
log: function(message) {
$log.log(message);
return $log;
}
}
}]);
describe('myLog tests', function () {
var myLog;
beforeEach(module('myModule'));
beforeEach(inject(function (_myLog_) {
myLog = _myLog_;
})); it('should log what my writting', function () {
expect(myLog.log('hello world').log.logs).toContain(['hello world']);
});
});
</script>
</body>
</html>
以上代码中module('myModule')可以看成是var aa = angular.injector(['ng','ngMock','myModule']);,而后面的injector(function(_myLog_)...可以看成aa.invoke(['myLog',function(myLog){...。
Angular.js中的$injector服务的更多相关文章
- Angular JS 中的服务注册方法
在Angular JS中创建服务的几种方法 factory() service() constant() value() provider() factory(name,fn(){}) 该服务为单例的 ...
- 秒味课堂Angular js笔记------Angular js中的工具方法
Angular js中的工具方法 angular.isArray angular.isDate angular.isDefined angular.isUndefined angular.isFunc ...
- angular.js 中同步视图和模型数据双向绑定,$watch $digest $apply 机制
Angular.js 中的特性,双向绑定. 让视图的改变直接反应到数据中,数据的改变又实时的通知到视图,如何做到的? 这要归功于 scope 下面3个重要的方法: $watch $digest $ap ...
- angular.js:13920 Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope <- testServe
angular.js:13920 Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope <- testSer ...
- (网页)Angular.js 中 copy 赋值与 = 赋值 区别
转自st.gg Angular.js 中 copy 赋值与 = 赋值 区别 为什么用 $scope.user = $scope.master; $scope.master 会跟着 $scope.use ...
- angular.js 中的作用域 数据模型 控制器
1.angular.js 作为后起之秀的前端mvc框架,他于传统的前端框架都不同,我们再也不需要在html中嵌入脚本来操作对象了.它抽象出了数据模型,控制器及视图. 成功解耦了应用逻辑,数据模型,视图 ...
- Angular.js中处理页面闪烁的方法详解
Angular.js中处理页面闪烁的方法详解 前言 大家在使用{{}}绑定数据的时候,页面加载会出现满屏尽是{{xxx}}的情况.数据还没响应,但页面已经渲染了.这是因为浏览器和angularjs渲染 ...
- 在Angular.js中的H5页面调用Web api时跨域问题处理
/// <summary> /// 被请求时 /// 在Angular.js中的H5页面调用Web api时跨域问题处理 /// </summary> /// <para ...
- Angular JS中的依赖注入
依赖注入DI angularjs中与DI相关有angular.module().angular.injector(). $injector.$provide. DI 容器3要素:服务的注册.依赖关系的 ...
随机推荐
- php pdo_mysql使用方法
<?php $dsn='mysql:host=127.0.0.1;port=3306;dbname=bisai'; $username='root'; $password=''; $driver ...
- Knockoutjs官网翻译系列(三) 使用Computed Observables
书接上回,前面谈到了在视图模型中可以定义普通的observable属性以及observableArray属性实现与UI元素的双向绑定,这一节我们继续探讨第三种可实现绑定的属性类型:computed o ...
- 武汉科技大学ACM :1004: 零起点学算法74——Palindromes _easy version
Problem Description “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串.请写一个程序判断读入的字符串是否是“回文”. Input 输入包含多 ...
- Android触摸事件的分发机制
---恢复内容开始--- 一.MotionEvent : ACTION_DOWN(下按事件).ACTION_UP(松开事件).ACTION_MOVE(移动事件) 二.三大函数 1.dispatchTo ...
- 使用SOCKET TCP
刚刚接触SOCKET编程,网上看了一些资料,发现做些简单的应用还是不难.但是要深入了解SOCKET编程还需要系统的看一些书.一般在进程间通信TCP是一种不错的方式. ---XXX TCP链接是面向流的 ...
- 认识cocos2d-x jsbinding
近年来HTML5风起云涌,特别在移动端已经被更多的人熟识.H5跨平台,在线更新等特性,被人们津津乐道.然后就出现了各种H5的框架,甚至多达100种,真是让开发者眼花缭乱,笔者作为一个从事H5游戏开发一 ...
- 0X0000124
求教卡饭网友,都快疯掉了. 最近搞设计,电脑频发出现蓝屏,今晚都出现三次了,新装的win7 64位系统,都是安装的原版光驱. 错误代码基本上都是:0x00000124 (0x000 ...
- Day02
1.os.system()和os.popen() os.popen() 功能强于os.system() , os.popen() 可以返回回显的内容,以文件描述符返回 eg: import os re ...
- pyenv简介——Debian/Ubuntu中管理多版本Python
pyenv简介——Debian/Ubuntu中管理多版本Python MAY 21ST, 2016 12:00 AM | COMMENTS pyenv是管理Python版本的工具,它支持在多个Pyth ...
- jquery keyup 在IOS设备上输入中文时不触发
今天做一个异步查询功能的时候发现在IOS设备上查询中文时keyup没有触发,在其他设备上时可以的,后来在stackoverflow上找到下面这种解决方法,贴出来算是抛砖引玉了. $h_input.on ...