本文转载自http://camnpr.com/javascript/1693.html

首先,provider, value, constant, service, factory他们都是provider!(decorator小朋友先搬个小板凳坐在边上等会儿,现在还没轮到你出场哈~)

一、provider是干啥的?

provider可以为应用提供通用的服务,形式可以是常量,也可以是对象。
比如我们在controller里常用的$http就是AngularJS框架提供的provider~

myApp.controller(‘MainController', function($scope, $http) {
$http.get(…)
}

在上面的代码里,就可以直接使用$http包好的各种功能了~
provider
那我们自己想定制一个provider,怎么写呢~

$provide.provider('age', {
start: 10,
$get: function() {
return this.start + 2;
}
}); //或
$provide.provider('age', function($filterProvider){
this.start = 10;
this.$get = function() {
return this.start + 2;
};
});

调用:

app.controller('MainCtrl', function($scope, age) {
$scope.age = age; //
});

provider的基本原则就是通过实现$get方法来在应用中注入单例,使用的时候拿到的age就是$get执行后的结果。 上面例子中的两种定义方法都可以~

二、factory

大哥provider每次出场太繁琐了,如果我就想定义个$get,没别的乱七八糟的呢?这时候该二哥factory出场了~

$provide.provider('myDate', {
$get: function() {
return new Date();
}
});
//可以写成
$provide.factory('myDate', function(){
return new Date();
}); //调用:
app.controller('MainCtrl', function($scope, myDate) {
$scope.myDate = myDate; //current date
});

直接第二个参数就是$get要对应的函数实现,代码简单了很多有没有?!

三、service

这时候我又来劲儿了,我不仅就想定义个$get,里面我还就返回个new出来的已有js类,三哥service闪亮登场~

$provide.provider('myDate', {
$get: function() {
return new Date();
}
}); //可以写成 $provide.factory('myDate', function(){
return new Date();
}); //可以写成
$provide.service('myDate', Date);

对于这种需求,代码更简洁了是不是~~

四、value vs. constant

更直接的需求来了,我只想定义个$get,而且就返回个常量~
这时候value和constant都可以做到~

$provide.value('pageCount', 7);
$provide.constant('pageCount', 7);

兄弟俩功能一样?双胞胎?那怎么可能~
介绍区别前,先得把之前坐小板凳等着的decorator叫出来~终于该出场了~
区别一:value可以被修改,constant一旦声明无法被修改
$provide.decorator('pageCount', function($delegate) {
return $delegate + 1;
});
decorator可以用来修改(修饰)已定义的provider们,除了constant~
区别二:value不可在config里注入,constant可以
myApp.config(function(pageCount){
//可以得到constant定义的'pageCount'
});

关于config,之后会专门介绍~

五、通过底层实现代码看关系~

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_;
} function factory(name, factoryFn) { return provider(name, { $get: factoryFn }); }
function service(name, constructor) {
return factory(name, ['$injector', function($injector) {
return $injector.instantiate(constructor);
}]);
} function value(name, value) { return factory(name, valueFn(value)); } function constant(name, value) {
providerCache[name] = value;
instanceCache[name] = value;
} function decorator(serviceName, decorFn) {
var origProvider = providerInjector.get(serviceName + providerSuffix),
orig$get = origProvider.$get;
origProvider.$get = function() {
var origInstance = instanceInjector.invoke(orig$get, origProvider);
return instanceInjector.invoke(decorFn, null, {$delegate: origInstance});
};
}

从上面的代码可以看出之前介绍的每种provider的特点,decorator比较特殊,不算,除了constant,另外几个最终调用的都是provider~
最后再总结一下provider哥儿几个的优点~
1. 为应用提供通用的服务,形式可以是常量或对象
2. 便于模块化
3. 便于单元测试

AngularJS之Provider, Value, Constant, Service, Factory, Decorator的区别与详解的更多相关文章

  1. 转载:[AngularJS系列] 那伤不起的provider们啊~ (Provider, Value, Constant, Service, Factory, Decorator)

    来源:http://hellobug.github.io/blog/angularjs-providers/ 用AngularJS做项目,但凡用过什么service啊,factory啊,provide ...

  2. [AngularJS系列(4)] 那伤不起的provider们啊~ (Provider, Value, Constant, Service, Factory, Decorator)(转)

    用AngularJS做项目,但凡用过什么service啊,factory啊,provider啊,开始的时候晕没晕?!晕没晕?!感觉干的事儿都差不多啊,到底用哪个啊?!别告诉我你们几个就是为了跟我炫耀兄 ...

  3. [转]angularjs的provider~ (Provider, Value, Constant, Service, Factory, Decorator)

    用AngularJS做项目,但凡用过什么service啊,factory啊,provider啊,开始的时候晕没晕?!晕没晕?!感觉干的事儿都差不多啊,到底用哪个啊?!别告诉我你们几个就是为了跟我炫耀兄 ...

  4. 构建安全的Xml Web Service系列之wse之错误代码详解

    原文:构建安全的Xml Web Service系列之wse之错误代码详解 WSE3.0现在还没有中文版的可以下载,使用英文版的过程中,难免会遇到各种各样的错误,而面对一堆毫无头绪的错误异常,常常会感到 ...

  5. Web Service学习之八:Soap消息详解

    一.区别概念 WSDL是网络服务描述语言,是XML文档:它包含一系列描述某个web service的定义或者说是规则.尤其是定义了传输Sope消息的结构 Soap:简单对象访问协议,是交换数据的一种协 ...

  6. Android中的Service与进程间通信(IPC)详解

    Service 什么是Service 在后台长期运行的没有界面的组件.其他组件可以启动Service让他在后台运行,或者绑定Service与它进行交互,甚至实现进程间通信(IPC).例如,可以让服务在 ...

  7. SpringBoot 三层架构 Controller、Service、Dao作用和关系详解

    首先创建一个springboot项目. model层 model层也叫pojo层或者entity层,个人比较喜欢pojo层. 一般数据库的一张表对应一个pojo层,并且表中所有字段都在pojo层都一一 ...

  8. 设计模式之装饰(Decorator)模式 代码详解

    /** * Created with IntelliJ IDEA. * User: HYY * Date: 13-10-27 * Time: 下午10:49 * To change this temp ...

  9. AngularJS 中 Provider 的用法及区别

    在一个分层良好的 Angular 应用中,Controller 这一层应该很薄.也就是说,应用里大部分的业务逻辑和持久化数据都应该放在 Service 里. 为此,理解 AngularJS 中的几个 ...

随机推荐

  1. SHIFT后门拿服务器之方法总结

    提权工具如下:cmd.exe Churrasco.exe nc.exe 提权前提:Wscript组件成功开启 如果Wscript组件被关闭,则使用以下方法开启: 源代码: <object run ...

  2. HTML5实战与剖析之触摸事件(touchstart、touchmove和touchend)(转)

    HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...

  3. mysql中DATETIME,DATE和TIMESTAMP的区别整理

    简而言之.看格式,DATE 是 年月日YYYY-MM-DD,DATETIME 是 年月日时分秒YYYY-MM-DD HH:MM:SS,TIMESTAMP是 年月日时分秒YYYY-MM-DD HH:MM ...

  4. XPath使用小结

    参考资料: http://www.w3school.com.cn/xpath/xpath_nodes.asp

  5. 关于标准C语言的预定义宏【转】

    标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来. __LINE__  当 ...

  6. shell学习之路:流程控制(for)

    for循环的语法: 1.  for 变量 in 值1 值2 值3.... do 程序 done 例如:下列脚本会分别打印4次 分别是morning noon afternoon evening的值 # ...

  7. R语言 奇怪的NA

    > 1+NA [1] NA > NA==1 [1] NA > c(NA,1:50) [1] NA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  8. POJ 2155 Matrix

    二维树状数组....                          Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissio ...

  9. jquery获取文本框的内容

    使用jquery获取文本框的内容有以下几种: 1.根据ID取值(id属性): // javascript <script type="text/javascript"> ...

  10. 传统BIOS+UEFI 系统引导修复

    一.    去网上下载一款pe软件:BIOS+UEFI引导修复工具这个软件支持传统bios和最新的UEFI引导(1)进入PE环境(win也可以,不过引导损坏一般不能进win),打开软件         ...