我应该使用工厂还是服务来获取AngularJS中的数据?

这个问题在这里已经有了答案:

  • AngularJS:什么时候使用服务而不是工厂8个答案

  • 我想我会详细阐述一个真实的答案。 我相信服务和工厂之间的差异非常微妙,并不重要。

    但是,您表示您知道什么是工厂,以及设计模式中的服务是什么。 我想我会详细阐述一下,因为我认为工厂和服务 - 适用于AngularJS - 有点误导。

    首先,工厂设计模式基本上是创建其他对象的对象。 但是,当您在AngularJS中创建工厂时; 您不使用该工厂创建其他对象。 从Angular Factory返回的对象是一个Singleton,当您访问该工厂时,只有一个对象会返回。 所以,一个Angular工厂的意义与我在合格中使用的“Factory”不同。 实际上,当您创建一个Angular工厂时,您有责任在工厂功能内创建该对象。 一旦对象被创建,总是返回相同的对象。 所以一个Angular Factory甚至不会创建一个新的对象。 就像我从其他语言中了解他们一样,它就像一个工厂。

    服务设计模式实际上只是组织不同功能的一种奇特方式,以便与它们分离。 回到学校时,我们只是称之为“封装”,我不认为它是一种设计模式。 AngularJS服务和AngularJS工厂都可以帮助您做到这一点。

    Angular Service也是一个单例,但是第一次引用这个服务时,它会在这个对象上调用'new'。 这意味着该服务会创建一个新对象 - 所以AngularJS服务更像是一个工厂而不是AngularJS工厂。 Angular服务仍然是一个单例,所以一旦创建了对象,总是会返回相同的对象。

    出于所有实际目的,我使用一项服务。 他们似乎更容易设置。 但差异似乎非常微妙。


    好的,我们来补充一下工厂和服务工作方式的细节。

    说,你有这样的对象:

    MyObject - function MyObject(){
     foo : "bar";
    }
    

    这个对象存在于AngularJS之外,可以在任何JavaScript中使用。 如果你想和工厂一起使用它, 你会做这样的事情:

    MyApp.factory('MyObjectFactory', function(){
        return new MyObject();
    });
    

    注意我必须手动调用新的MyObject()函数才能在工厂函数中创建一个新对象。 我也可以返回一个现有的对象,像这样:

    MyApp.factory('MyObjectFactory', function(){
        return MyObject;
    });
    

    现在,你想把它传递给一个像这样的控制器:

    function MyController($scope, MyObjectFactory) {}
    

    Angular在控制器中查找参数并查找MyObjectFactory。 如果它尚未实例化,则调用工厂函数,并返回结果。 结果被缓存,所以每次Angular需要引用MyObjectFactory时,它都会返回第一次创建的对象。 Singleton中返回的对象,这就是你如何在不同的控制器之间共享同一个对象。

    这里的关键是工厂函数被执行一次; 在工厂的第一次访问。 它不用于管理同一类型的多个对象的创建。

    同一对象之外的服务可以像这样创建:

    MyApp.service('MyObjectService', MyObject);
    

    并传递到相同的控制器,如下所示:

    function MyController($scope, MyObjectFactory, MyObjectService) {}
    

    当Angular第一次需要引用MyObjectService时,它将执行“new MyObject()”并返回该对象。 该对象被缓存,每次需要MyObjectService时,都会返回相同的对象。

    在创建过程之后,它与使用AngularJS Factory相同。 它是一个单例对象,您可以使用它来共享控制器之间的数据或功能。

    所以,简而言之,当使用服务时,会自动创建对象的新实例。 使用工厂时,返回工厂函数返回的任何对象。

    在引擎盖下,服务和工厂都使用提供者。 通过一项服务,为您提供工厂功能。 有了工厂,您可以随心所欲地创建该功能。

    链接地址: http://www.djcxy.com/p/77535.html

    上一篇: Should I use factory or service for fetching data in AngularJS?

    下一篇: Display Current Date on JSF Page