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);

ChildControlleruiルーター状態で使用しています。状態テンプレートが読み込まれず、コンソールに次のエラーが表示されます。

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

何か案は?

4

1 に答える 1

0

angular.injector新しいインジェクター インスタンス (より適切に聞こえる場合はアプリケーション インスタンス) を作成し、Angular アプリ内の運用環境では使用しないでください。いえ

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

コントローラーを登録できる場合は、依存関係に手を加える必要がありBaseControllerます。これを行う唯一の場所は構成フェーズです。

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

これは である必要BaseControllerがありconstantfactoryそれでやりたいことを制限する可能性があります。面白くないですね。

したがって、ここで行うより良いことは、

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 に答える