angularjs - 在 AngularJS 中集成辅助函数

标签 angularjs dependency-injection

所以,我刚刚开始学习 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/

相关文章:

javascript - 如何扩展 DIV "angular way"(使用 Angular 砌体)

javascript - 从 ng-repeat 访问第一项

javascript - 更改查询字符串而不重新加载/刷新

dependency-injection - MVC5、WebAPI2 和 Ninject 无参数构造函数错误

c++ - GUI 应用程序和单例/依赖注入(inject)

javascript - 获取 Javascript Web 控制台日志格式字符串

java - Mockito - 所需返回的模拟对象未在测试类(CUT)中使用

java - 空指针异常 Spring Integration 消息传递

java - mockito @Mock 没有按预期注入(inject)命名的@Resource

javascript - kendo ui Angular 网格选择事件