0

我正在尝试使用 conrollerAs 语法扩展控制器。我的父控制器和子控制器没有定义在同一个范围内,所以我把父控制器(BaseController)放在一个服务中:

angular.module('myApp').factory('BaseController', function() {
  var BaseController = function(fooService, barService) {
    // base controller constructor logic
  }

  BaseController.prototype = {
    // base controller methods
  }

  return BaseController;
});

然后像这样使用它:

var ChildController = function(BaseController, fooService, barService) {
  BaseController.apply(this, [fooService, barService]);
}

var BaseController = angular.injector(['myApp']).get('BaseController');

ChildController.prototype = Object.create(angular.extend(BaseController.prototype, {
  fooMethod: function() {
    // do stuff
  }
}));

angular.module('myApp').controller('ChildController', ChildController);

ChildController在ui路由器状态下使用。状态模板未加载,并且我在控制台中收到错误消息:

Resource for page controller is not defined <div class="ng-scope" ui-view="foo-view">

有任何想法吗?

4

1 回答 1

0

angular.injector创建一个新的注入器实例(它是应用程序实例,如果它听起来更好的话)并且不应该在 Angular 应用程序的生产环境中使用。IE

angular.injector(['myApp']).get('BaseController') !== angular.injector(['myApp']).get('BaseController');

BaseController当您仍然能够注册控制器时,您需要将自己的手放在依赖关系上,而这样做的唯一地方是配置阶段,

angular.module('myApp').config(function($controllerProvider, BaseController) {
  ...
  $controllerProvider.register('ChildController', ...)
});

这需要BaseControllerbe constant, not factory,并且可能会限制您想用它做的事情。听起来没那么好笑,不是吗?

所以在这里做的更好的事情就是

var ChildController = function(BaseController, fooService, barService) {
  angular.extend(this, BaseController.prototype, { ... });
  BaseController.apply(this, [fooService, barService]);
}

angular.module('myApp').controller('ChildController', ChildController);

由于上述原因,Angular DI 不太适合 OOP JS,仍然需要补充其他模块化解决方案。

于 2015-12-30T15:43:56.600 回答