2013-05-15 48 views
25

我不知道什麼是最佳實踐和我應該使用什麼。當創建服務方法module.service和module.factory之間有什麼區別

以下兩種方法有什麼區別?

module.service(..); 

module.factory(..); 
+4

的可能重複[Angular.js:服務提供VS VS工廠?(HTTP:// stackoverflow.com/questions/15666048/angular-js-service-vs-provide-vs-factory) –

+0

@MarkRajcok這是但這裏的答案有更好的例子 –

回答

47

有一個關於這個偉大的谷歌組後從帕維爾·科茲洛夫斯基:

https://groups.google.com/forum/#!msg/angular/hVrkvaHGOfc/idEaEctreMYJ

從鮑威爾引:

其實$ provide.provider, $ provide.factory和$ provide.service是 或多或少都是相同的東西,因爲它們都是 創建對象實例的藍圖/指令(那些 實例隨即準備注入協作者)。

$ provide.provider是註冊 藍圖最複雜的方法,它允許您擁有複雜的創建功能和 配置選項。

$ provide.factory是$ provide.provider的簡化版本,當您的 不需要支持配置選項,但仍然希望具有更復雜的創建邏輯時 。

$ provide.service適用於整個創建邏輯將 簡化爲調用構造函數的情況。

所以,這取決於你的建築邏輯的複雜性,你會選擇 $ provide.provider,$ provide.factory和$ provide.service 之一,但你會得到的到底是一個新的實例。

這裏是伴隨小提琴證明(從線程):http://jsfiddle.net/pkozlowski_opensource/PxdSP/14/

,代碼:

var myApp = angular.module('myApp', []); 

//service style, probably the simplest one 
myApp.service('helloWorldFromService', function() { 
    this.sayHello = function() { 
     return "Hello, World!" 
    }; 
}); 

//factory style, more involved but more sophisticated 
myApp.factory('helloWorldFromFactory', function() { 
    return { 
     sayHello: function() { 
      return "Hello, World!" 
     } 
    }; 
}); 

//provider style, full blown, configurable version  
myApp.provider('helloWorld', function() { 

    this.name = 'Default'; 

    this.$get = function() { 
     var name = this.name; 
     return { 
      sayHello: function() { 
       return "Hello, " + name + "!" 
      } 
     } 
    }; 

    this.setName = function(name) { 
     this.name = name; 
    }; 
}); 

//hey, we can configure a provider!    
myApp.config(function(helloWorldProvider){ 
    helloWorldProvider.setName('World'); 
}); 


function MyCtrl($scope, helloWorld, helloWorldFromFactory, helloWorldFromService) { 

    $scope.hellos = [ 
     helloWorld.sayHello(), 
     helloWorldFromFactory.sayHello(), 
     helloWorldFromService.sayHello()]; 
} 
+2

+1關於服務與工廠有幾個更受歡迎的問題/答案(vs提供者)的概念(我已經翻了幾遍),但這是迄今爲止最明確的解釋。如果我早日找到它,會節省很多時間:) – gkalpak

+0

那些依賴關係的函數呢?你可以使用DI符號嗎? 'myApp.service('helloWorldFromService',['$ resource',function($ resource){...}'? –

+0

當然。http://plnkr.co/edit/bjWLgAVhdXHRk8K1Gzl5?p=preview – lucuma

1

考慮以下服務。

angular.module("myModule", []) 
.service("thingCountingService", function() { 
    var thingCount = 0; 
    this.countThing = function() { thingCount++; } 
    this.getNumThings = function() { return thingCount; } 
}); 

如果你有一個應用程序,其中各種控制器,意見等,所有想參與的事情之一普通計數,上述服務的工作。

但是如果每個應用都想保留自己的東西,那該怎麼辦?

在這種情況下,單件服務將不起作用,因爲它只能跟蹤所有這些服務。但是,工廠允許您在每次啓動新計數器時創建一項新服務。

angular.module("myModule", []) 
.factory("thingCountingServiceFactory", function() { 
    var thingCount = 0; 
    this.countThing = function() { thingCount++; } 
    this.getNumThings = function() { return thingCount; } 
}); 

通過以上的工廠,你可以調用new thingCountingServiceFactory()在任何時候,得到一個新的thingCountingService設置爲0

+0

你是什麼意思通過 - 「但是,如果每個應用程序都想保留自己的東西,那該怎麼辦?」我有一個應用程序,也有每個人。 –

相關問題