在控制器中使用带有功能参考的服务

时间:2016-03-11 18:00:45

标签: javascript angularjs function model-view-controller

我正在阅读关于Angular最佳做法的some documentation,并且我遇到了一个声明named functions for controllers are better than than anonymous的部分。

/* recommended */

// dashboard.js
angular
    .module('app')
    .controller('DashboardController', DashboardController);

function DashboardController() { }

但是,如果我想传递服务,这怎么可行呢?使用我以前使用的匿名语法只是

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

如何通过传递函数来完成此操作,以便遵循最佳实践。

2 个答案:

答案 0 :(得分:0)

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

var DashboardController = function(SomeService) { };
var dashboardControllerArray = ['SomeService', DashboardController];
angular
    .module('app')
    .controller('DashboardController', dashboardControllerArray);
但是,我个人觉得这不是必要的。您之前已经提供了控制器的名称,这与变量名称一样具有描述性。如果你打算重用一个控制器函数,你可以这样做,但如果你这样做,你也可以创建一个可重用的 AngularJS 控制器。

我也不会将您链接的文档称为“文档”。它本质上是一篇博客文章,作者出于某种原因决定在GitHub上主持,并且明确表示这是一篇评论文章。这不是错误(其中一些可能真的很有帮助),但你不需要把它当作一个建议。

答案 1 :(得分:0)

在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) { /* ... */ }