Angular JS Refactor Controller依赖注入

时间:2014-10-22 20:21:33

标签: javascript angularjs

我想知道是否有办法抽象出多个角度控制器使用的依赖关系。

例如,如果我的StudentCtrlTeacherCtrl都利用了$scope$rootScope$routeParams$http,那么一种将这些抽象出来的方法,比如standardDependencies,然后将standardDependencies注入两个控制器,而不是写出所有共享控制器?

离。

app.controller('StudentCtrl', ['standardDependencies', function(standardDependencies){

}]);

我知道这是通常使用的服务,因为我没有看到任何用于注入$scope之类的内容的示例,只有自定义函数。

3 个答案:

答案 0 :(得分:2)

您无法为$scope执行此操作,因为每个控制器可能会有所不同。

实际的类似单身的服务,是的,你可以从技术上包装到另一个服务中:

app.service('standardDependencies', ['$rootScope', ..., function($rootScope, ...) {
  this.$rootScope = $rootScope;
  ...
}}]);

但我没有看到任何有充分理由这样做。如果StudentCtrlTeacherCtrl非常相似,那么他们可能都应该依赖PersonService之类的包含常用功能的内容。

答案 1 :(得分:0)

这可能是不好的做法,但您可以在standardDependencies的顶部定义数组app.js,然后使用array.concat

例如:

// app.js
standardDependencies = ['$rootScope', '$rootParams', '$location', '$http', '$translate']

// controller.js
app.controller('StudentCtrl', standardDependencies.concat(['$q', '$log', etc, 
  function($rootScope, ..., $log){ ... }]);

你仍然需要将它们列为函数参数,但至少你不必将它们列出两次,一次作为字符串,一次作为参数。

答案 2 :(得分:-1)

使用某种提供者;然而,这不是很好的做法,因为它可能使角度摘要周期难以管理这些参考。这违反了依赖注入的最佳实践。

如果您希望您的范围可以访问所有的依赖关系,a)执行适当的范围继承或b)只进行本机注入。

我希望有所帮助。 :d