我开始学习AngularJS的基础知识并查看一些示例代码:
'use strict';
angular.module('someModule')
.factory('DateFormatter', function () {
var clean = function (date) {
return moment(date).format('YYYY-MM-DD');
};
return {
clean:clean
};
});
任何人都可以告诉我为什么有必要(或者最佳实践,或许?)在底部包含返回区块?它是否使得clean()函数可以被外部代码或类似的东西访问?
谢谢
答案 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
函数,但不能从外部调用,因为你没有返回它。