AngularJS服务中返回{...}块的目的是什么?

时间:2016-02-08 10:53:33

标签: angularjs

我开始学习AngularJS的基础知识并查看一些示例代码:

'use strict';

angular.module('someModule')
.factory('DateFormatter', function () {
  var clean = function (date) {
    return moment(date).format('YYYY-MM-DD');
  };

  return {
    clean:clean
  };
});

任何人都可以告诉我为什么有必要(或者最佳实践,或许?)在底部包含返回区块?它是否使得clean()函数可以被外部代码或类似的东西访问?

谢谢

3 个答案:

答案 0 :(得分:0)

你也可以写

angular.module('someModule')
.factory('DateFormatter', function () {
  return {
    clean: function (date) {
      return moment(date).format('YYYY-MM-DD');
    };
  }
});

这是完全相同的事情。 但对于具有更多代码的更大功能,第一个更具可读性。所以是的,这只是最佳实践,但不是必要的

答案 1 :(得分:0)

从角度documentation on providers

  

Factory recipe使用具有零个或多个参数的函数构造新服务(这些是对其他服务的依赖性)。此函数的返回值是此配方创建的服务实例。

在您的示例中,工厂返回一个具有.clean属性的匿名对象。您声明这些的顺序无关紧要;您可以先声明返回,或先声明函数,或者声明函数内联;一切都会达到同样的效果。

//form 1
var clean = function(date) {
  return moment(date).format('YYYY-MM-DD');
};

return {
  clean: clean
};

//form 2
var service = {
  clean: clean
};

return service;

function clean(date) {
  return moment(date).format('YYYY-MM-DD');
};

//form 3
return {
  clean: function(date) {
    return moment(date).format('YYYY-MM-DD');
  };
};

推荐表单是John Papa创建的热门style guide中的表单2。这样做的原因是,通过在顶部声明可调用成员,您可以立即看到工厂将返回的内容,而无需扫描实现细节。

答案 2 :(得分:0)

通过使用工厂方法,你几乎告诉AngularJS,每当请求DateFormatter的对象时(例如,通过依赖注入机制),它应执行方法你传递给factory(..., ...)的第二个参数,并提供该函数返回的对象而不是函数本身。

也就是说,Angular不会提供您定义的方法,而是提供方法返回的对象。这几乎就是“工厂”这个词。指的是:'当我要求时,为我创建这个对象。

如果它返回了该函数,那么所有改变的就是你必须自己调用该函数,以便它为你提供一些值/对象,例如:

.controller(DateFormatter) {
  // If Angular returned the function rather than it's returned value,
  // you would have to do this in order to get access to the clean function:
  (DateFormatter()).clean();
}

从另一个意义上说,你假设它使clean函数可访问是正确的。为此,它还提供了一种封装机制。如果你这样做了:

angular.module('someModule')
.factory('DateFormatter', function () {
  var clean = function (date) {
    date = someHelperFunction(date);
    return moment(date).format('YYYY-MM-DD');
  };

  var someHelperFunction(date) {
    // do something here with date
  };

  return {
    clean:clean
  };
});

然后你可以从内部调用someHelperFunction函数,但不能从外部调用,因为你没有返回它。