Angularjs 服务注册
$injector:
(When you request a service, the $injector is responsible for finding the correct service provider, instantiating it and then calling its$getservice factory function to get the instance of the service.) $injector用来提供正确的服务provider,实例化服务,然后调用他的$get方法来获取服务实例
//provide源码
function provider(name, provider_) { if (isFunction(provider_)) { provider_ = providerInjector.instantiate(provider_); }
if (!provider_.$get) { throw Error('Provider ' + name + ' must define $get factory method.');
} return providerCache[name + providerSuffix] = provider_;
}
//service源码
function service(name, constructor) { return factory(name, ['$injector', function($injector) { return $injector.instantiate(constructor); }]);
}
本例引自 http://www.mamicode.com/info-detail-247448.html
// 创建myModule模块、注册服务
var myModule = angular.module('myModule', []);
myModule.service('myService', function() {
this.my = 0;
});
// 创建herModule模块、注册服务
var herModule = angular.module('herModule', []);
herModule.service('herService', function() {
return{her:1}
});
// 加载了2个模块中的服务,此处必须传入一个数组,即使只加载一个模块,并且angular.injector()可以调用多次,每次都返回新建的injector对象。
//$injector用法跟此例相同,只不过是作为服务注入到其他服务中去,然后又调用get,invoke等方法实例化其他服务
var injector = angular.injector(["myModule","herModule"]);
alert(injector.get("myService")); //injector.get("myService")会返回一个由myservice作为构造函数创建的对象
alert(injector.get("herService")); //此处会得到一个由herService返回的{her:1}对象
// 获取injector
var injector2 = angular.injector(["myModule"]);
//invoke与get的区别是一个传入回调函数或数组,一个传入服务名 // 第一种inference(如果用压缩工具的话,由于js压缩工具JavaScript minifiers/obfuscators会缩短变量名,因此myservice会被缩短);
injector2.invoke( function(myService){ alert(myService); } ); //获取到模块之后调用挂载在模块上的myservice服务,将服务名作为参数传入 // 第二种annotation
function foo(serviceA) {alert(serviceA.my);};
foo.$inject = ['myService'];
injector2.invoke(foo); // 第三种inline
injector.invoke(['myService', function(serviceA){alert(serviceA.my);}]); //inline方法其实就是一二方法的结合而已
$provide:
(The $provide service has a number of methods for registering components with the$injector. Many of these functions are also exposed onangular.Module.)
$provide 服务有一系列的方法(6个方法: provider,value,constant,factory,service,decorator),这些方法用 $injector来注册组件,大部分的方法都暴露在了angular.module下,也就是可以直接在module下调用这些函数。 注意,所有服务都是延迟实例化的。这意味着所有的服务只有在需要时,或者被依赖时才会实例化。换句话说,AngularJS不会实例化服务,除非被请求了或者被应用直接或间接依赖了。
provider(name, provider); factory(name, $getFn); service(name, constructor); value(name, value); constant(name, value); decorator(name, decorator);
provider的第二个参数如果是一个对象(第一种情况),会检索该对象的$get方法,然后调用该方法,最终得到的就是直接调用该方法后的返回值,而不是将该方法作为构造函数返回的新对象。如果第二个参数是函数,则会将该函数作为构造函数创建一个新对象,又再去检索$get方法,和第一种情况相同
factory的第二个参数最终也会作为$get方法返回一个值,而service第二个参数是传入一个构造器,因此只会返回对象(当然也包括数组,函数等)
value服务不能作为依赖注入config()方法中, 也就是 .config( function(value){ } )会报错, 但可作为依赖注入其他服务,并且值可以改变,constant可以注入config()中,但值不可被改变
decorator服务能够修改除constant(否则报错)以外的其他服务,第二个参数必须是一个函数,否则报错,就算修改value服务的值也需要在函数中返回修改后的值;修改service服务是可以返回任何值,不仅限于对象。 使用decorator必须在相应服务定义了之后才能修改,否则会报出找不到相应服务的错误。函数中传入的$delegate代表修改之前服务返回的原始值;
(此外,如controllerProvide.register(name,constructor),$filterProvider等$filterProvider.register(name,factory)可以用来注册一个过滤器,跟在模块上注册服务是一样的;)
run块,config块:
- Configuration blocks - get executed during the provider registrations and configuration phase. Only providers and constants can be injected into configuration blocks. This is to prevent accidental instantiation of services before they have been fully configured.
- Run blocks - get executed after the injector is created and are used to kickstart the application. Only instances and constants can be injected into run blocks. This is to prevent further system configuration during application run time.
When bootstrapping, first Angular applies all constant definitions. Then Angular applies configuration blocks in the same order they were r egistered. Run blocks are the closest thing in Angular to the main method. A run block is the code which needs to run to kickstart the application. It is executed after all of the services have been configured and the injector has been created. Run blocks typically contain code which is hard t o unit-test, and for this reason should be declared in isolated modules, so that they can be ignored in the unit-tests.
当引导程序开始时,angular会先运行所有的constant定义,这是为了可以在config运行之前注入config中,接着是config块会按照注册的顺序被执行,最后才是run块在服务配置好和注入器被创建之后执行。
Angularjs 服务注册的更多相关文章
- AngularJS笔记---注册服务
在前面的笔记中,了解到AngularJS的后台控制可以在Controller里面实现. 可是如果所有的逻辑代码都写到Controller会显得该Controller过于臃肿. 不方便维护, Angul ...
- 前端MVC学习总结(三)——AngularJS服务、路由、内置API、jQueryLite
一.服务 AngularJS功能最基本的组件之一是服务(Service).服务为你的应用提供基于任务的功能.服务可以被视为重复使用的执行一个或多个相关任务的代码块. AngularJS服务是单例对象, ...
- 前端MVC学习笔记(三)——AngularJS服务、路由、内置API、jQueryLite
一.服务 AngularJS功能最基本的组件之一是服务(Service).服务为你的应用提供基于任务的功能.服务可以被视为重复使用的执行一个或多个相关任务的代码块. AngularJS服务是单例对象, ...
- 18.angularJS服务
转自:https://www.cnblogs.com/best/tag/Angular/ 服务 AngularJS功能最基本的组件之一是服务(Service).服务为你的应用提供基于任务的功能.服务可 ...
- Consul 服务注册与服务发现
上一篇:Mac OS.Ubuntu 安装及使用 Consul 1. 服务注册 对 Consul 进行服务注册之前,需要先部署一个服务站点,我们可以使用 ASP.NET Core 创建 Web 应用程序 ...
- 分布式服务注册和发现consul 简要介绍
Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,Consul的方案更"一站式",内置了服务注册与发现框 架 ...
- Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****
http://www.idouba.net/spring-cloud-source-eureka-client-api/?utm_source=tuicool&utm_medium=refer ...
- springcloud(第三篇)springcloud eureka 服务注册与发现 *****
http://blog.csdn.net/liaokailin/article/details/51314001 ******************************************* ...
- Dubbo_异常_服务注册运行正常但是Dubbo-Admin看不到服务(亲测可用)
一.背景: 1.Dubbo服务正常注册到ZooKeeper 2.客户端调用Dubbo服务正常 二.原因: Dubbo-Admin未配置分组信息 三.解决步骤: 1.dubbo.properties添加 ...
随机推荐
- Hibernate2
计应134(实验班) 杨伟 Hibernate 中提供了两级Cache(高速缓冲存储器),第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存.这一级别的缓存由hibernate管理的,一 ...
- CSS字体属性大全
文章转自:http://www.10wy.net/Article/CSS/CSS_list_8.html查看更多更专业性的文章请到:网页设计网 CSS字体属性 字体名称属性(font-family) ...
- hibernate3 所需的jar包
- ubuntu 安装MTK 移动终端usb驱动
lsusbBus 001 Device 002: ID 8087:8000 Intel Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation ...
- [转载]va_start和va_end使用详解
va_start和va_end使用详解 原文地址:http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html 本文主要介绍va_s ...
- win7配上的网关会自动消失?解决
前几天遇见一台计算机,发现手动设置的ip和网关等...在使用了一会就变成,网关丢失,其他不变...奇怪啊...第一次遇见.后来找了一下.有答案了. 先将客户端卸载掉,再打开网络和共享中心-->本 ...
- 访问本地Access 数据出错
访问本地的access数据库时,出现了OleDbException 10Aug2015 晚: 好像找到了问题所在, 虽然不知道背后深层次的原因 改用了C#, 然后command 语句里也update了 ...
- MVC中使用js拼接的元素验证问题
MVC使用的验证方式本质上是jquery.validation js 拼接的格式如下: <input class='required' title='请输入项目名称!' id='Project ...
- ios之JavaScript
初次接触java脚本,感觉java脚本so interesting!为什么呢?写javascript代码感觉就像是在记流水账,无拐弯抹角,一个字,就是"干",想怎么干就怎么干,哈哈 ...
- JS第二天简单总结
布尔型变量:true,flase 广泛用于真假的逻辑判断 对象:分类,对象是由一些彼此相关的属性和方法集合在一起而构成的一个数据实体: 例如,var today = new Date();中,Date ...