Angularjs 如何一步在多个控制器中进行依赖项注入
我使用的是ionic1,我有多个控制器,每个控制器用于不同的页面。 考虑以下注射:Angularjs 如何一步在多个控制器中进行依赖项注入,angularjs,dependency-injection,Angularjs,Dependency Injection,我使用的是ionic1,我有多个控制器,每个控制器用于不同的页面。 考虑以下注射: .controller('login', function($scope, $http, $location, $state,$rootScope , auth,$timeout) .controller('Home', function($scope, $rootScope, $http, $state,$location, $ionicNavBarDelegate, $timeout, auth, getDa
.controller('login', function($scope, $http, $location, $state,$rootScope , auth,$timeout)
.controller('Home', function($scope, $rootScope, $http, $state,$location, $ionicNavBarDelegate, $timeout, auth, getData)
所以我有大约10个。
大多数注入对所有控制器都是通用的,例如$scope、$rootScope
和其他一些控制器。
因此,我想知道是否存在一个一次性注入所有依赖项的一行程序。注入所有依赖项与依赖项注入的概念相矛盾(除了控制器可以具有本地依赖项这一事实之外)。依赖关系是控制器所依赖的
如果有多个控制器具有匹配的依赖项,则它们可以继承基本控制器。若子控制器应该有自己的依赖项,那个么这可以通过自动将依赖项分配给控制器实例的基类来完成。控制器继承最适用于ES6类:
class BaseController {
static get $inject() {
return ['$rootScope', '$scope', '$timeout'];
}
constructor(...deps) {
this.constructor.$inject.forEach((depName, i) => {
this[depName] = deps[i];
});
}
}
class SomeController extends BaseController {
static get $inject() {
return [...super.$inject, 'some'];
}
constructor(...deps) {
super(...deps);
...
}
}
app.controller('SomeController', SomeController);
您可以创建一个工厂,返回一些最常用的依赖项 大概是这样的:
angular
.module('app')
.factory('common', common);
common.$inject = ['$rootScope', '$http', '$state'];
function common($rootScope, $http, $state) {
var service = {
$rootScope: $rootScope,
$http: $http,
$state: $state
};
return service;
}
然后您只需要在控制器中包含common
服务,并像这样使用它:common.$rootScope
希望这有帮助:)
编辑
正如@estus在评论中所说,使用
$scope
将失败,因为$scope
是本地依赖项,在服务/工厂中不可用。这不应该是一个问题,因为我建议尽量避免使用$scope
(使用controllerAs语法)在ionic 1环境中支持ES6吗?我正在寻找一个单行程序,但我想旧方法比您建议的ES6方法更好。它不依赖于ionic,而是依赖于您的目标平台,基本上是Android 5+和iOS 9+,请参阅。ES6类是语法上的糖类,列出这些类是为了便于说明。在ES5中进行继承是可能的,但它将涉及更多难以理解的代码。因此,是的,大多数情况下,“旧方法”更简单,而且可以完成任务。请注意,您需要注释服务并重复dep列表,这就是干式控制器类可能更短更干净的地方。它将失败,因为$scope
是本地控制器依赖项,而问题是如何摆脱重复的“$scope”(毫无疑问,它是重复次数最多的dep)。