从父控制器注入依赖项

时间:2018-03-30 13:34:38

标签: angularjs

我们正在使用$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>

1 个答案:

答案 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