我们正在使用$routeProvider
将一些依赖项注入路由配置。这样的东西:
.when("/some/url", {
templateUrl: "/some/html",
controller: "someController",
controllerAs: "vm",
resolve: {
__variable: ["someServiceDependency", function (someServiceDependency) {
return someServiceDependency.someCall();
}]
}
})
这样,我们向控制器注入__var:
angular
.module("someModule")
.controller("someController", someController);
someController.$inject = [
"$scope",
...
"__variable"];
function someController(
$scope,
...
__variable) {
... here we do something with __variable
}
我们现在遇到的问题是该someController
是通过路由渲染的,但也用作其他控制器的嵌套控制器
<div>
....some html rendered via ng-route.....
<div ng-controller="someController">
... specific data from someController
</div>
</div>
因此,当渲染嵌套控制器时,Angular找不到__variable Provider,因为它不存在。
一个选项是将所有这些依赖项声明为提供商,而不是在resolve
部分中设置它们,但最后,该方法将创建数十个提供者,我们宁愿将控制权放在一个部分中。
是否可以通过NG-INIT"注入",或者如果提供者存在,则可以注入,或者如果不存在,则填充空?这样我们就可以做类似的事情:
<div>
....some html rendered via ng-route.....
<div ng-controller="someController" ng-init="initVariable(__variable)">
... specific data from someController
</div>
</div>
您可以使用 $injector
服务以获取依赖关系,以获取以下情况:
var servicePresent = $injector.has('testService');
if (servicePresent) {
testService = $injector.get('testService');
$scope.response = testService.testFn();
}
这是工作示例:https://plnkr.co/edit/tut1y9s5xvofllakait0?p=preview