我们正在使用$routeProvider
为路由配置注入一些依赖项。像这样:
.when("/some/url", {
templateUrl: "/some/html",
controller: "someController",
controllerAs: "vm",
resolve: {
__variable: ["someServiceDependency", function (someServiceDependency) {
return someServiceDependency.someCall();
}]
}
})
我们将__variable注入控制器:
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无法找到__variableProvider,因为它不存在。
一种选择是将所有这些依赖项声明为提供程序,而不是在resolve
部分中设置它们,但最后该方法将创建数十个提供程序,我们更愿意将控件保留在一个部分中。
是否可以通过ng-init“注入”,或者如果提供者存在则注入,或者如果不存在则填充为空?这样我们可以做类似的事情:
<div>
....some html rendered via ng-route.....
<div ng-controller="someController" ng-init="initVariable(__variable)">
... specific data from someController
</div>
</div>
答案 0 :(得分:0)
如果它存在,您可以使用$injector
服务来获取依赖性:
var servicePresent = $injector.has('testService');
if (servicePresent) {
testService = $injector.get('testService');
$scope.response = testService.testFn();
}
以下是工作示例: https://plnkr.co/edit/tUT1y9s5xvofLlAkAIT0?p=preview