在创建服务方法时,module.service和module.factory之间的区别是什么

时间:2013-05-15 12:33:22

标签: angularjs

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

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

module.service(..);

module.factory(..);

2 个答案:

答案 0 :(得分:47)

Pawel Kozlowski有一篇很棒的google小组帖子:

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

引自Powel:

  

实际上是$ 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()];
}

答案 1 :(得分: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