如何在一个步骤中在多个控制器中执行依赖项注入

时间:2017-11-13 10:09:46

标签: 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, getData)

所以我有大约10个。 大多数注射对所有控制器都是通用的,例如$scope,$rootScope和其他控制器。 所以我想知道是否有一个单行程序可以一次性注入所有依赖项。

2 个答案:

答案 0 :(得分:3)

您可以创建一个返回一些最常用依赖项的工厂。

这样的事情:

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语法)

答案 1 :(得分:1)

注入所有依赖项与依赖注入的概念相矛盾(除了控制器可以具有本地依赖性的事实)。依赖性是控制器依赖的原因。

如果有多个控制器具有匹配的依赖关系,则它们可以继承基本控制器。如果子控制器应该有自己的依赖关系,这可以通过自动为控制器实例分配依赖关系的基类来完成。控制器继承最适合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);