直入正题

一.constant服务:
app.constant('name',obj)
name为服务的名字,obj为一个json对象.
js:


serviceApp.constant('myConfig',{
name:'code_bunny',
age:12,
getId:function(){
return 1
}
});
解析
constant创建服务返回一个json对象(也就是第二个参数中传入的对象),这个对象里可以有参数,可以有方法

,并且,属性和方法都可以在控制器中修改,新增,但是按照它的设计本意,一般constant创建的服务不会去修

改它的内容,需要修改内容,最好用value来创建服务.

1.它是一个引用对象,无论被注入多少个控制器中,实际都指向同一个对象,所以,无论修改其中的哪一个,其
它所有的服务都会被改变.
2.服务修改过后,ng不会自动同步,简单的说,就是它没有做到自动双向绑定数据,比如在这里给服务新增了
love属性:angular.extend(myConfig,{love:'zxg'}),我需要使用$scope.$watch(myConfig.love,function
(){$scope.love = myConfig.love;})这样才能把love属性值同步到视图中.
3.constant服务不能通过decorator进行装饰,(什么是装饰下面会讲到)

二.value服务:
app.value('name',obj为一个json对象.
js:


serviceApp.value('myConfig',
getId:function(){
return 1
}
});


serviceApp.config(function($provide){
$provide.decorator('myConfig',function($delegate){
$delegate.money = '100w';
return $delegate
})
});
运行结果: http://jsfiddle.net/p0dqr7wy/1/
说明:
value创建服务返回一个json对象(也就是第二个参数中传入的对象),可以有方法,并


且,按照它的设计本意,如果属性和方法需要被修改内容,就用value


来创建服务.
constant和value主要就是用于存放一些数据或方法以供使用,区别是constant一般是存放固定内容,value存


放可能会被修改的内容
注意点:
1.同constant注意点1
2.同constant注意点2
3.value可以被装饰,所以这里myConfig服务拥有了money属性.(装饰具体怎么用,下面会说)

三.factory服务
app.factory('name',function(){return obj})
name为服务的名字,第二个参数传入一个函数,函数需要有一个返回值obj,返回一个对象.实际被注入的服务


就是这个对象.
js:


serviceApp.factory('myConfig',function(){
var myname = 'code_bunny';
var age = 12;
var id = 1;
return {
name: myname,
age: age,
getId: function(){
return id
}
}
});


或者是这样:


serviceApp.factory('myConfig',function(){
return new constructorFun()
});


function constructorFun(){
var myname = 'code_bunny';
var age = 12;
var id = 1;
this.name = myname;
this.age = age;
this.getId = function(){
return id
}
}


装饰部分代码:


serviceApp.config(function($provide){
$provide.decorator('myConfig',function($delegate){
console.log($delegate);
$delegate.money = '100w';
return $delegate
})
});


运行结果:
http://jsfiddle.net/8kuxt3xc/
http://jsfiddle.net/ua2y617q/
说明:
factory服务是最常见最常用的服务类型,几乎可以满足90%的自己开发的需求,使用它可以编写一些逻辑,通


过这些逻辑最后返回所需要的对象.比如使用$http来获取一些数据.我们就在factory创建的服务里抓取数据


,最后返回.
它和constant,value最大的区别是,factory服务是有一个处理过程,经过这个过程,才返回结果的.
注意点:
1.同constant注意点1
2.同constant注意点2
3.factory返回的服务也可以被装饰,下面会说)

四.service服务
app.service('name',constructor)
name为服务的名字,constructor是一个构造函数.
js:


serviceApp.service('myConfig',function(){
var myname = 'code_bunny';
var age = 12;
var id = 1;
this.name = myname;
this.age = age;
this.getId = function(){
return id
}
});


或者是这样:


serviceApp.service('myConfig',constructorFun);
function constructorFun(){
var myname = 'code_bunny';
var age = 12;
var id = 1;
this.name = myname;
this.age = age;
this.getId = function(){
return id
}
}


装饰部分代码同上.
运行结果:
http://jsfiddle.net/1qj8m5ot/
http://jsfiddle.net/0bh67cog/
说明:
service和factory的区别在于,它第二个参数传入的是一个构造函数,最后被注入的服务是这个构造函数实例


化以后的结果.所以基本上使用service创建的服务的,也都可以使用factory来创建.
所以这里,factory服务的第二种写法和使用service是一致的:
serviceApp.factory('myConfig',function(){
return new constructorFun()
});
//等价于
serviceApp.service('myConfig',constructorFun);
注意点:
1.同constant注意点1
2.同constant注意点2
3.service返回的服务也可以被装饰,下面会说)

五.provider服务


app.provider('name',function(){
  ....
  return {
    ...
    $get:function(){
      ...
      return obj
    }
}
})


name为服务的名字,第二个参数接受一个函数,函数返回一个对象,返回的对象比如要有$get方法,$get方法必


须要返回一个对象obj,这个对象就是真正被注入的服务.
栗子一:
js:


serviceApp.provider('myConfig',function(){
return {
$get:function(){
var myname = 'code_bunny';
var age = 12;
var id = 1;
return {
name: myname,
age: age,
getId: function(){
return id
}
}
}
}
});


装饰部分代码同上.
运行结果: http://jsfiddle.net/2pz2ft73/
说明:
provider服务的第二个参数的返回值中必须要有$get方法(除了$get,还可以有其它方法,后面的例子会说


到),$get方法就相当于factory服务的第二个参数,最后要返回一个对象,这个对象就是真正被注入的服务:
栗子二:
js:


serviceApp.provider('myConfig',function(){
var id = 1;
return {
setID:function(newID){
id = newID
},
$get:function(){
var myname = 'code_bunny';
var age = 12;
return {
name: myname,
age: age,
getId: function(){
return id
}
}
}
}
});
serviceApp.config(function(myConfigProvider){
myConfigProvider.setID(2)
});


装饰部分代码同上.
运行结果:http://jsfiddle.net/hcpemex3/
说明:
这里的provider服务不仅仅返回了$get方法,还返回了setID方法,然后id变量是写在函数里的,返回值的外面


,形成一个闭包,可以被修改.
然后,在provider服务里定义的方法,可以在config函数里调用.注意调用的格式:

如何调用provider定义的服务中的方法: serviceApp.config(function(myConfigProvider){ myConfigProvider.setID(2) }); 被注入的服务名不叫myConfig,而是myConfigProvider.然后在函数里面可以调用myConfigProvider的setID 方法(也就是myConfig的setID方法). 通过这种方式,使得我们的服务可以被手动配置,比如这里可以配置id. ng有很多内置的服务都有这样的功能,比如$route服务,$location服务,当我们通过$routeProvider和 $locationProvider来配置的时候,其本质就是这些服务是通过provider创建的. 注意点: 1.同constant注意点1 2.同constant注意点2 3.provider返回的服务也可以被装饰,下面会 说); 六.装饰服务 其实通过上面这么多的例子,看也能看懂装饰是什么了... app.config(function($provide){ $provide.decorator('name',function($delegate){ $delegate.money = '100w'; return $delegate }) }); 同样是通过config,在参数函数中注入$provider服务,$provider服务有个decorator方法,它接受两个参数,第一个参数'name',是要被装饰的服务的名字,第二个参数是一个函数,函数中注入$delegate,$delegate就是 被装饰的服务的实例,然后在函数中操作$delegate,就相当于操作了该服务的实例. 注意: 1.最后一定要return $delegate,这样服务才算被装饰完成了. 2.constant服务是不能被装饰的. 栗子就不说了吧,上面的都是~ 总结上面的内容: 1.服务的实例被注入到控制器以后,都是一个引用对象,其它所有的服务都会被改变. 2.服务的实例被修改过后,需要使用$scope.$watch()监测其变化并手动刷新视图. 3.constant服务不能通过decorator进行装饰. 4.一些固定的参数和方法,使用constant 5.可能被修改的参数和方法,使用value 6.通过逻辑处理后得到的参数或方法,使用factory 7.可以使用factory的也可以使用service,反之亦然(一般就是用factory) 8.可以手动配置参数的服务,使用provider 七.可以创建不同实例的服务 之前我们说到,所有的服务的实例都是引用对象,其它所有的服务都会被改变.这就是ng服务的设计模式,一般不需要去改变,但如果有 特殊需要,要能够每次注入控制器后得到新的实例,可以这样做: 我们给服务添加了一个方法,每次执行一次这个方法,都会创建一个新的实例,这样,虽然在控制器里注入的是 服务实例还是同一个,但是在调用创建实例方法的时候,然后就可以单独修改这个实 例,而不会影响到其它控制器:如下 js: var serviceApp = angular.module('serviceApp',[]); serviceApp.controller('myCtrl',function($scope,myConfig){ var myConfigConstant = myConfig.create(); $scope.name = myConfigConstant.name; $scope.age = myConfigConstant.age; angular.extend(myConfigConstant,{love:'zxg'}); $scope.love = myConfigConstant.love; $scope.id = myConfigConstant.getId(); $scope.$watch(myConfigConstant.name,function(){$scope.name = myConfigConstant.name;}); myConfigConstant.name = 'white_bunny'; }); serviceApp.controller('myOtherCtrl',myConfig){ var myConfigConstant = myConfig.create(); $scope.love = myConfigConstant.love; $scope.name = myConfigConstant.name; $scope.$watch(myConfigConstant.name,function(){$scope.name = myConfigConstant.name;}); }); /************************创建实例的服务************************/ serviceApp.factory('myConfig',function(){ return { //服务返回的对象有一个create方法,该方法每次被执行都会返回一个新的constructorFun实例     create: constructorFun.createNew } }); //创建一个构造函数 function constructorFun(){ var myname = 'code_bunny'; var age = 12; var id = 1; this.name = myname; this.age = age; this.id = id } //给构造函数添加createNew方法,用于实例化一个constructorFun. constructorFun.createNew = function(){ return new constructorFun() }; //给构造函数添加原型的方法.使得它的实例可以继承. constructorFun.prototype = { getId: function(){ return this.id } };

angularJS中的核心服务深入理解的更多相关文章

  1. ios – 属性类型’id’与从’UIToolbar’警告继承的类型’id’不兼容

    我刚刚安装了xcode5,现在我收到了这个警告.我以前从未见过它.我的应用运行良好,但我讨厌看到一个警告.有谁知道这是什么以及如何解决它?

  2. ios – 使用Swift 3.0附近的蓝牙设备

    )我只是使用函数内置的参数来提及它确实是一个IOBluetoothDevice对象,而且只是要求打印这些信息.最后的说明我希望在Swift中使用IOBluetooth时,我创建的这个Q/A可以帮助其他有需要的人.缺乏任何教程和大量过时的Objective-C代码使得查找此信息非常具有挑战性.我要感谢@RobNapier在一开始就试图找到这个谜题的答案的支持.我还要感谢NotMyName在AppleDeveloper论坛上对我的post的回复.我将在iOS设备中更早地探索这种用法!

  3. ios – 如何使用新的Apple Swift语言发布JSON

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  4. ios – 向UITextField输入右视图UIImageView

    我有一个目标操作,当按下按钮时,我验证UITextFields:我的UITextFields添加到viewDidLoad中的视图,如下所示:如何使右视图UIImageView出现?解决方法你确定你没有丢失UITextField框架吗?你正在设置rightviewmode吗?这是我刚才写的一个例子,似乎工作正常.结果如下:

  5. ios – 从后台线程显示的UIAlertView和没有委托创建EXC_BAD_ACCESS

    解决方法不要从后台线程弄乱UI.在主线程上创建一个方法并调用该方法:

  6. ios – 无法转换为`AnyObject?`?

    .不应该有任何东西可以转换为AnyObject??这是我的主要代码:提前致谢.解决方法AnyObject是所有类符合的协议.要定义只能由类采用的协议,请添加:类到定义:没有这个修改,可以是struct或enum类型,也不能转换为AnyObject.

  7. ios – 如何在Swift中执行委派的基本实现?

    我试图让我的头脑围绕代表团,并将其剥离到一个基本的实现.我想出了这个,但委托函数永远不会被调用.任何人都可以解释一下吗?解决方法Point是在调用callDelegate()之前需要分配委托.要检查委派是否正常工作,可以使用委托初始化DelegatorClass.

  8. ios – 将UIApplicationDelegate方法转换为RxSwift Observables

    得到打印然后我在RxCocoa的_RXDelegateProxy_类中得到以下崩溃:有谁知道问题可能是什么?或者有没有人成功实现过像rx_applicationDidBecomeActive这样的东西?

  9. ios – testflight库和Xcode 5没有变化现在说“ld:找不到-lTestFlight的库”

    我已经创建了几个月的应用程序,突然Xcode5不想构建它.它只是抱怨以下错误.如果我理解它可以,它会抱怨testflight,但我几周没有改变它.它完美地编译了它.我不得不说我已经尝试将AdobeADMS跟踪库添加到项目中.然后,出现链接器错误.任何提示?

  10. 【swift_4】swift之代理传值(delegate的用法)

    具体的代码,详见Demo:链接:http://pan.baidu.com/s/1gdkyWE3密码:4mhvrootViewControllersecondViewController

随机推荐

  1. Angular2 innerHtml删除样式

    我正在使用innerHtml并在我的cms中设置html,响应似乎没问题,如果我这样打印:{{poi.content}}它给了我正确的内容:``但是当我使用[innerHtml]=“poi.content”时,它会给我这个html:当我使用[innerHtml]时,有谁知道为什么它会剥离我的样式Angular2清理动态添加的HTML,样式,……

  2. 为Angular根组件/模块指定@Input()参数

    我有3个根组件,由根AppModule引导.你如何为其中一个组件指定@input()参数?也不由AppModalComponent获取:它是未定义的.据我所知,你不能将@input()传递给bootstraped组件.但您可以使用其他方法来做到这一点–将值作为属性传递.index.html:app.component.ts:

  3. angular-ui-bootstrap – 如何为angular ui-bootstrap tabs指令指定href参数

    我正在使用角度ui-bootstrap库,但我不知道如何为每个选项卡指定自定义href.在角度ui-bootstrap文档中,指定了一个可选参数select(),但我不知道如何使用它来自定义每个选项卡的链接另一种重新定义问题的方法是如何使用带有角度ui-bootstrap选项卡的路由我希望现在还不算太晚,但我今天遇到了同样的问题.你可以通过以下方式实现:1)在控制器中定义选项卡href:2)声明一个函数来改变控制器中的散列:3)使用以下标记:我不确定这是否是最好的方法,我很乐意听取别人的意见.

  4. 离子框架 – 标签内部的ng-click不起作用

    >为什么标签标签内的按钮不起作用?>但是标签外的按钮(登陆)工作正常,为什么?>请帮我解决这个问题.我需要在点击时做出回复按钮workingdemo解决方案就是不要为物品使用标签.而只是使用divHTML

  5. Angular 2:将值传递给路由数据解析

    我正在尝试编写一个DataResolver服务,允许Angular2路由器在初始化组件之前预加载数据.解析器需要调用不同的API端点来获取适合于正在加载的路由的数据.我正在构建一个通用解析器,而不是为我的许多组件中的每个组件设置一个解析器.因此,我想在路由定义中传递指向正确端点的自定义输入.例如,考虑以下路线:app.routes.ts在第一个实例中,解析器需要调用/path/to/resourc

  6. angularjs – 解释ngModel管道,解析器,格式化程序,viewChangeListeners和$watchers的顺序

    换句话说:如果在模型更新之前触发了“ng-change”,我可以理解,但是我很难理解在更新模型之后以及在完成填充更改之前触发函数绑定属性.如果您读到这里:祝贺并感谢您的耐心等待!

  7. 角度5模板形式检测形式有效性状态的变化

    为了拥有一个可以监听其包含的表单的有效性状态的变化的组件并执行某些组件的方法,是reactiveforms的方法吗?

  8. Angular 2 CSV文件下载

    我在springboot应用程序中有我的后端,从那里我返回一个.csv文件WheniamhittingtheURLinbrowsercsvfileisgettingdownloaded.现在我试图从我的角度2应用程序中点击此URL,代码是这样的:零件:服务:我正在下载文件,但它像ActuallyitshouldbeBook.csv请指导我缺少的东西.有一种解决方法,但您需要创建一个页面上的元

  9. angularjs – Angular UI-Grid:过滤后如何获取总项数

    提前致谢:)你应该避免使用jQuery并与API进行交互.首先需要在网格创建事件中保存对API的引用.您应该已经知道总行数.您可以使用以下命令获取可见/已过滤行数:要么您可以使用以下命令获取所选行的数量:

  10. angularjs – 迁移gulp进程以包含typescript

    或者我应该使用tsc作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部