我想知道是否有办法抽象出多个角度控制器使用的依赖关系。
例如,如果我的StudentCtrl
和TeacherCtrl
都利用了$scope
,$rootScope
,$routeParams
和$http
,那么一种将这些抽象出来的方法,比如standardDependencies
,然后将standardDependencies
注入两个控制器,而不是写出所有共享控制器?
离。
app.controller('StudentCtrl', ['standardDependencies', function(standardDependencies){
}]);
我知道这是通常使用的服务,因为我没有看到任何用于注入$scope
之类的内容的示例,只有自定义函数。
答案 0 :(得分:2)
您无法为$scope
执行此操作,因为每个控制器可能会有所不同。
实际的类似单身的服务,是的,你可以从技术上包装到另一个服务中:
app.service('standardDependencies', ['$rootScope', ..., function($rootScope, ...) {
this.$rootScope = $rootScope;
...
}}]);
但我没有看到任何有充分理由这样做。如果StudentCtrl
和TeacherCtrl
非常相似,那么他们可能都应该依赖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