在控制器中使用具有函数引用的服务

Use a service with function reference in controller

本文关键字:函数 引用 服务 控制器      更新时间:2023-09-26

我正在阅读一些关于 Angular 最佳实践的文档,我遇到了一个部分,其中指出控制器的命名函数比匿名函数更好。

/* recommended */
// dashboard.js
angular
    .module('app')
    .controller('DashboardController', DashboardController);
function DashboardController() { }

但是,如果我想传入服务,这如何工作?使用我习惯的匿名语法,它只是

.controller('DashboardController', ['SomeService', function(SomeService){
  SomeService.someFn();
}]);

如何通过传入函数来做到这一点,以便我可以遵循最佳实践。

有多种

方法可以在 Angular 中指定依赖关系。首先,您可以使用相同的表示法,只传递命名函数而不是匿名函数:

angular
    .module('app')
    .controller('DashboardController', ['SomeService', DashboardController]);
function DashboardController (SomeService) { /* ... */ }

另一种方法是向控制器添加一个包含控制器的所有依赖项的 $inject 属性。我喜欢这种方法,因为它可以保持模块注册干净(注册控制器时不再需要指定依赖项):

angular
    .module('app')
    // SO FRESH AND SO CLEAN
    .controller('DashboardController', DashboardController);
DashboardController.$inject = ['SomeService'];
function DashboardController (SomeService) { /* ... */ }

您可以将用于内联表示法的数组存储在变量中。

var DashboardController = function(SomeService) { };
var dashboardControllerArray = ['SomeService', DashboardController];
angular
    .module('app')
    .controller('DashboardController', dashboardControllerArray);

不过,我个人认为没有必要。您之前已经给出了控制器的名称,它与变量名称一样具有描述性。如果你打算重用控制器函数,你可以这样做,但如果你这样做,你也可以创建一个可重用的AngularJS控制器。

我也不会称您链接的来源为"文档"。它本质上是作者出于某种原因决定在 GitHub 上托管的博客文章,并且很明显它是一篇评论文章。这并没有(其中一些可能真的很有帮助),但你不需要把它当作一个建议。