Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何一步在多个控制器中进行依赖项注入_Angularjs_Dependency Injection - Fatal编程技术网

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

Angularjs 如何一步在多个控制器中进行依赖项注入,angularjs,dependency-injection,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, getDa

我使用的是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
和其他一些控制器。 因此,我想知道是否存在一个一次性注入所有依赖项的一行程序。

注入所有依赖项与依赖项注入的概念相矛盾(除了控制器可以具有本地依赖项这一事实之外)。依赖关系是控制器所依赖的

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

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

大概是这样的:

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

在ionic 1环境中支持ES6吗?我正在寻找一个单行程序,但我想旧方法比您建议的ES6方法更好。它不依赖于ionic,而是依赖于您的目标平台,基本上是Android 5+和iOS 9+,请参阅。ES6类是语法上的糖类,列出这些类是为了便于说明。在ES5中进行继承是可能的,但它将涉及更多难以理解的代码。因此,是的,大多数情况下,“旧方法”更简单,而且可以完成任务。请注意,您需要注释服务并重复dep列表,这就是干式控制器类可能更短更干净的地方。它将失败,因为
$scope
是本地控制器依赖项,而问题是如何摆脱重复的“$scope”(毫无疑问,它是重复次数最多的dep)。