父母控制器的注入依赖性



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

最新更新