所以,我刚刚开始学习 Angular
,我的问题是有哪些方法(或最佳实践)可以将辅助函数注入(inject) AngularJS?我经常需要包含功能来辅助我的 Controller ,但我在网上读到 Controller 应该保持尽可能少的逻辑,这意味着它们应该被注入(inject) Controller 并在模块中声明(胖模块,瘦 Controller )。
因此,我主要是像这样注入(inject)函数:
$provide.value
$provide.value('MySQLtoJS', function(datetimeString) {
var t = datetimeString.split(/[- :]/);
var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]);
return d;
});
这使用 $provide
服务来创建一个可以注入(inject)到我的 Controller 中的 value
。然而,对于更复杂的功能,例如那些需要注入(inject)剂的功能,我一直在使用这个:
工厂
提供者
.factory('convertMySQLToJS', ['moment', function(moment) {
return function(arrayInput) {
if (Array.isArray(arrayInput)) {
for (var i = 0; i < arrayInput.length; i++) {
var t = arrayInput[i].begin_datetime.split(/[- :]/);
var start = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]);
arrayInput[i].begin_datetime = start;
var t = arrayInput[i].end_datetime.split(/[- :]/);
var end = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]);
arrayInput[i].end_datetime = end;
//Also create the moment message
if (arrayInput[i].begin_datetime >= new Date()) {
arrayInput[i].message = 'Begins at ' + moment(arrayInput[i].begin_datetime).format('MMMM Do YYYY, h:mm a') + ' and likely ends at ' + moment(arrayInput[i].end_datetime).format('MMMM Do YYYY, h:mm a');
}
else {
arrayInput[i].message = 'Began at ' + moment(arrayInput[i].begin_datetime).format('MMMM Do YYYY, h:mm a') + ' and likely ended at ' + moment(arrayInput[i].end_datetime).format('MMMM Do YYYY, h:mm a');
}
}
return arrayInput;
}
}
}])
然而,工厂通常用于其服务和属性(如 $http
),或者有人告诉我。所以我最近被一些人建议我应该通过使用 $rootScope
将它们包含在 run
配置 block 中(这对我来说似乎有点奇怪)并给出它是我需要的功能的属性。由于我是 Angular 的新手,而且我发现文档相当缺乏,我想知道如果有正确的方法,我应该如何将辅助函数正确地注入(inject) Angular
?
最佳答案
在 Angular 中正确的方法是将 helpers 包装到服务中,并在需要时注入(inject)它们。将几个主题相似的方法加入单个帮助程序服务(将其视为实用程序类)是一个好主意。
可以是factory
,也可以是value
,也可以是constant
。后者更适合此类事情,因为它也可以在 config
block 中使用。它们在其他方面是可以互换的,只要 factory
函数由 return
语句组成并且不使用其他依赖项。由于这个
app.factory('mysqlHelper', function (moment) {
return {
MySQLtoJS: function(datetimeString) { ... },
convertMySQLToJS: return function(arrayInput) { ... }
};
});
使用moment
依赖,factory
就是这样。
使用全局变量(在全局 JS 作用域或 $rootScope 上)被认为是 bad practice :
Of course, global state sucks and you should use $rootScope sparingly, like you would (hopefully) use with global variables in any language. In particular, don't use it for code, only data. If you're tempted to put a function on $rootScope, it's almost always better to put it in a service that can be injected where it's needed, and more easily tested.
因此它提供了一个理由:可测试性。服务是可测试的。它们可以被单元测试,它们可以被模拟。这就是 Angular 依赖注入(inject)的亮点。
关于angularjs - 在 AngularJS 中集成辅助函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32489843/