我已经看到angular.factory()和angular.service()被用来声明服务;然而,我找不到角。在官方文件的任何地方提供服务。

这两种方法有什么区别? 哪个应该用来做什么(假设它们做不同的事情)?


当前回答

以下是主要的区别:

服务

语法:模块。service('serviceName',函数);

结果:当将serviceName声明为可注入参数时,你将得到传递给module.service的函数实例。

使用方法:可以通过简单地将()附加到注入的函数引用来共享有用的实用程序函数。也可以用injectedArg运行。调用(这个)或类似的方法。

工厂

语法:模块。factory('factoryName',函数);

结果:当将factoryName声明为一个可注入参数时,将为您提供通过调用传递给module.factory的函数引用返回的值。

用法:可能用于返回一个'class'函数,然后可以重新创建实例。

下面是使用服务和工厂的示例。阅读更多关于AngularJS服务vs工厂的文章。

你也可以查看AngularJS的文档和类似的关于stackoverflow混淆服务和工厂的问题。

其他回答

工厂模式更灵活,因为它可以返回函数和值以及对象。

恕我直言,在服务模式中没有太多意义,因为它所做的一切都可以通过工厂轻松完成。例外可能是:

如果您出于某种原因关心实例化服务的声明类型——如果您使用服务模式,则构造函数将是新服务的类型。 如果您已经有一个正在其他地方使用的构造函数,并且还想将其用作服务(尽管如果您想向其中注入任何东西,可能没有多大用处!)。

Arguably, the service pattern is a slightly nicer way to create a new object from a syntax point of view, but it's also more costly to instantiate. Others have indicated that angular uses "new" to create the service, but this isn't quite true - it isn't able to do that because every service constructor has a different number of parameters. What angular actually does is use the factory pattern internally to wrap your constructor function. Then it does some clever jiggery pokery to simulate javascript's "new" operator, invoking your constructor with a variable number of injectable arguments - but you can leave out this step if you just use the factory pattern directly, thus very slightly increasing the efficiency of your code.

这里所有的答案似乎都围绕着服务和工厂,这是有效的,因为这就是被问到的问题。但同样重要的是要记住,还有其他几个变量,包括provider()、value()和constant()。

关键是要记住,每一个都是另一个的特殊情况。每一种特殊情况都允许你用更少的代码做同样的事情。每一种都有一些额外的限制。

要决定什么时候使用哪个,你只需看看哪个允许你用更少的代码做你想做的事情。下面这张图说明了它们是多么相似:

对于一个完整的分步分解和快速参考何时使用每一个,你可以访问我得到这张图片的博客文章:

http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/

App.factory ('fn',fn) vs. app.service('fn',fn)

建设

对于工厂,Angular将调用该函数来获得结果。它是被缓存和注入的结果。

 //factory
 var obj = fn();
 return obj;

对于服务,Angular会通过调用new来调用构造函数。构造的函数被缓存和注入。

  //service
  var obj = new fn();
  return obj;

实现

工厂通常返回一个对象文字,因为返回值是注入到控制器、运行块、指令等中的值

  app.factory('fn', function(){
         var foo = 0;
         var bar = 0;
         function setFoo(val) {
               foo = val;
         }
         function setBar (val){
               bar = val;
         }
         return {
                setFoo: setFoo,
                serBar: setBar
         }
  });

服务函数通常不返回任何东西。相反,它们执行初始化和公开函数。函数也可以引用“this”,因为它是用“new”构造的。

app.service('fn', function () {
         var foo = 0;
         var bar = 0;
         this.setFoo = function (val) {
               foo = val;
         }
         this.setBar = function (val){
               bar = val;
         }
});

结论

当涉及到使用工厂或服务时,它们都非常相似。它们被注入到控制器、指令、运行块等中,并以几乎相同的方式用于客户端代码。它们都是单例的——这意味着同一个实例在注入服务/工厂的所有地方共享。

那么你更喜欢哪一种呢?不管是哪一种,它们都非常相似,差异微不足道。如果您选择其中一个而不是另一个,请注意它们是如何构造的,以便您可以正确地实现它们。

简单地说…

Const user = { 名字:“约翰” }; / /工厂 const addLastNameFactory = (user, lastName) => ({ 用户, 姓, }); console.log (addLastNameFactory(用户、“母鹿”)); / /服务 const addLastNameService = (user, lastName) => { 用户。lastName = lastName;/ /坏!突变 返回用户; }; console.log (addLastNameService(用户、“母鹿”));

以下是主要的区别:

服务

语法:模块。service('serviceName',函数);

结果:当将serviceName声明为可注入参数时,你将得到传递给module.service的函数实例。

使用方法:可以通过简单地将()附加到注入的函数引用来共享有用的实用程序函数。也可以用injectedArg运行。调用(这个)或类似的方法。

工厂

语法:模块。factory('factoryName',函数);

结果:当将factoryName声明为一个可注入参数时,将为您提供通过调用传递给module.factory的函数引用返回的值。

用法:可能用于返回一个'class'函数,然后可以重新创建实例。

下面是使用服务和工厂的示例。阅读更多关于AngularJS服务vs工厂的文章。

你也可以查看AngularJS的文档和类似的关于stackoverflow混淆服务和工厂的问题。