那么问题来了,Angular 提供了三种方法来创建并注册我们的 service:factory, service 和 provider 。
Factory :
- 用 factory 就是创建一个对象,为他添加属性,然后把这个对象 return 出来。当你把 service 传进 controller 以后,在 controller 中这个对象的属性就可以通过 factory 使用了。
var app = angular.module('app',[]);app.factory('myFactory',function(){ var test = {}; test.name = "Jason"; test.sayHello = function(){console.log("hello world")}; return test;});app.controller("myCtrl",function($scope,myFactory){ $scope.greet =myFactory.test.sayHello; //use the attrs of the obj in the factory})
Service:
- service 是用 new 关键字实例化的。因此,你应该给 this 添加属性,然后 service 返回 this。你把 service 传进 controller 以后,在 controller 里 this 上的属性就可以用通过 service 来使用了
app.service('myService',function(){ var _artist = "Nelly"; this.getAritist = function(){ return _artist; };});app.controller("myCtrl",function($scope,myService){ $scope.getArtist = myService.getArtist;});
- Provider :
Providers 是唯一一种你可以传进 .config() 函数的 service。当你想要在 service 对象启用之前,先进行模块范围的配置,那就应该用 provider。
app.provider("myProvider",function(){ this._artist = " " ; this.thingFromConfig = " " ; this.$get = function(){ var that = this; return { getArtist : function(){ return that._artist; }, thingOnConfig : that.thingFromConfig } }, thingOnConfig });app.controller("myController",function($scope,myProvider){ $scope.artist = myProvider.getArtist(); $scope.data.thingFromConfig = myProvider.thingOnConfig;});app.config(function(myProviderProvider){ myProviderProvider.thingFromConfig = "This was set in config() " ;})