25

我不知道什么是最佳实践以及我应该使用什么。

以下两种方法有什么区别?

module.service(..);

module.factory(..);
4

2 回答 2

47

Pawel Kozlowski 有一篇很棒的谷歌群组帖子:

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()];
}
于 2013-05-15T13:19:47.830 回答
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

于 2014-07-14T20:29:51.803 回答