在angular中,何时应该使用工厂或服务?

21 浏览
0 Comments

在angular中,何时应该使用工厂或服务?

请谅解我之前的回答。我知道还有其他答案,比如:

AngularJS: Service vs provider vs factory

但是我仍然弄不懂什么时候应该使用service而不是factory。

根据我的理解,factory通常用于创建可以由多个控制器调用的“公共”函数: Creating common controller functions

Angular文档似乎更喜欢使用factory而不是service。他们甚至在使用factory时也提到了“service”,这更加令人困惑! http://docs.angularjs.org/guide/dev_guide.services.creating_services

那么,什么时候应该使用service呢?

是否有些事情只能使用service或者使用service更容易实现?

背后是否有一些不同的操作?性能/内存方面是否有差异?

这里有一个例子。除了声明的方式不同,它们看起来是相同的,我无法弄清楚为什么我要选择其中之一。 http://jsfiddle.net/uEpkE/

更新:根据Thomas的回答,似乎意味着service用于更简单的逻辑,而factory用于更复杂的逻辑和私有方法,所以我更新了下面的fiddle代码,结果发现两者都能支持私有函数?

myApp.factory('fooFactory', function() {
    var fooVar;
    var addHi = function(foo){ fooVar = 'Hi '+foo; }
    return {
        setFoobar: function(foo){
            addHi(foo);
        },
        getFoobar:function(){
            return fooVar;
        }
    };
});
myApp.service('fooService', function() {
    var fooVar;
    var addHi = function(foo){ fooVar = 'Hi '+foo;}
    this.setFoobar = function(foo){
        addHi(foo);
    }
    this.getFoobar = function(){
        return fooVar;
    }
});
function MyCtrl($scope, fooService, fooFactory) {
    fooFactory.setFoobar("fooFactory");
    fooService.setFoobar("fooService");
    //foobars = "Hi fooFactory, Hi fooService"
    $scope.foobars = [
        fooFactory.getFoobar(),
        fooService.getFoobar()
    ];
}

0
0 Comments

问题的原因是在Angular中,有多种方式可以创建可注入的服务,包括provider、factory、value、constant和service。不同的方式会导致不同的代码量和灵活性。解决方法是根据需求选择合适的方式来创建服务,如果provider已经能满足需求,则可以使用provider进一步创建其他类型的服务,从而减少代码量。

在Angular中,provider是最基础的服务创建方式,它可以创建其他类型的服务。factory是provider的一个特殊版本,它通过返回一个函数或对象来创建服务。value和constant是factory的特殊版本,它们分别返回一个值或常量。service是provider的另一个特殊版本,它使用构造函数来创建服务。

下图展示了provider的代码,通过高亮显示不同部分,可以看出哪些部分可以用来创建factory、value、constant等。

![AngularJS providers, factories, services, etc are all the same thing](https://i.stack.imgur.com/3LYMp.png)

通过选择合适的创建方式,可以根据需求来控制代码量。如果provider已经能满足需求,则可以直接使用provider来创建服务。如果需要更灵活的服务创建方式,则可以使用factory、value、constant或service来创建服务。

要了解更多细节和示例,请参考原文链接:[http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/](http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/)

0
0 Comments

在Angular中,我们经常会遇到使用factory或service的情况。然而,许多人并不清楚何时使用工厂模式(factory)或服务模式(service)。在这篇文章中,我们将探讨该问题的原因以及解决方法。

在stackoverflow上,有一个用户allernhwkim发布了一篇回答,链接到了他的博客。然而,这篇回答被一个管理员删除了。这篇博客是我找到的唯一一篇不仅仅告诉你如何用服务(service)、提供者(provider)和工厂(factory)做同样的事情,还告诉你使用提供者(provider)和工厂(factory)能做什么,而使用服务(service)不能做什么。

直接从他的博客中摘录了一段示例代码。这段代码展示了使用CarService的情况下,汽车总是具有4个汽缸,无法更改。而CarFactory返回一个函数,所以你可以在控制器中使用new CarFactory,并传入特定汽车的汽缸数量。而你无法使用new CarService,因为CarService是一个对象而不是一个函数。

另外,工厂模式(factory)不能直接返回一个函数供实例化,是因为这样你就无法在原型上添加属性等功能了。而通过工厂模式(factory)生成一个汽车工厂的示例,可以方便地添加功能。

,当你只需要一个简单的对象时,可以使用服务(service)。而当你需要实例化一个对象时,可以使用工厂模式(factory)。当你需要配置一个对象时,可以使用提供者(provider)。

如果你发现你的工厂模式(factory)只是返回一个对象,那么你应该考虑使用服务(service)。不应该这样做:

app.factory('CarFactory', function() {
    return {
        numCylinder: 4
    };
});

而应该使用服务(service):

app.service('CarService', function() {
    this.numCylinder = 4;
});

如果你用一个参数numCylinder来定义服务函数,那么它将具有与工厂模式(factory)相同的灵活性。

这篇博客提供了一个很好的解释,清楚地说明了服务(service)和工厂模式(factory)的区别。其他网上的例子都只是展示了如何用不同的服务做同样的事情。在这里,你真正回答了问题!

0
0 Comments

问题出现的原因是关于在Angular中何时使用工厂(factory)或服务(service)的疑问。解决方法是根据需要选择合适的方式。文章内容如下:

在Angular中,使用服务可以获得一个函数的实例(使用"this"关键字),而使用工厂可以获得通过调用函数引用返回的值(工厂中的return语句)。在AngularJS中,所有的提供者(value、constant、服务、工厂)都是单例。

在AngularJS中,使用工厂是最常见的方式。使用工厂的原因是,工厂方法非常灵活,可以包含复杂的创建逻辑。工厂是普通的函数,可以利用新的词法作用域来模拟“私有”变量,这对于隐藏给定服务的实现细节非常有用。

如果需要通过简单地追加"()"来调用的实用函数,那么使用服务可能会很有用。如果需要返回一个可以使用"new"操作符实例化的“类”函数,那么使用工厂可能会很有用。

总之,如果服务的逻辑很复杂,并且不想暴露这种复杂性,可以使用工厂。在其他情况下,如果只是想返回一个服务的实例,那么使用服务即可。但是随着时间的推移,你会发现80%的情况下你会使用工厂。

关于这个问题的更多细节可以参考这里的文章。

AngularJS团队给出了一个解释,工厂和服务是最常用的方式。它们之间唯一的区别是,服务适用于自定义类型的对象,而工厂可以产生JavaScript的基本类型和函数。

根据以上内容,可以得出结论:

- 如果想要像普通函数一样调用函数,请使用工厂。

- 如果想要通过new操作符实例化函数,请使用服务。

- 如果不知道差异,请使用工厂。

在实际应用中,如果服务非常复杂,并且需要私有方法和对象,那么使用工厂。如果想要返回服务的实例,请使用服务。

AngularJS团队更倾向于使用服务而不是工厂。但是如何选择取决于具体的用例和代码风格。

最后,文章中还提到了一些其他相关的资源和讨论链接。

以上就是关于在Angular中何时使用工厂或服务的问题的原因以及解决方法的整理。

0