web-dev-qa-db-ja.com

1つのコントローラーを2つの異なるビューに再利用するにはどうすればよいですか?

1つのコントローラーを定義し、わずかな違いで2つのビューに適用しました。

角度コード:

app.controller('MyCtrl', function($scope) {
   $scope.canSave = false;
   $scope.demo = {
      files : [{
         filename: 'aaa.html',
         source: '<div>aaa</div>'
      }, {
         filename: 'bbb.html',
         source: '<div>bbb</div>'
      }]
   }
   $scope.newFile = function(file) {
       $scope.demo.files.Push(file);
   }
   $scope.$watch("demo.files", function(val) {
       $scope.canSave = true;
   }, true);
});

ビュー1:

<div ng-controller="MyCtrl"></div>

ビュー2:

<div ng-controller="MyCtrl"></div>

サンプルコードは非常に単純ですが、私の実際のプロジェクトには多くのコードとロジックがあります。

ビュー1とビュー2の機能はほぼ同じですが、いくつかの違いがありますが、コントローラーでそれぞれのコードを記述する必要があります。

それらはほとんど同じロジックを持っているので、2つの異なるコントローラーを作成したくありません。ロジックはサービスであるほど一般的ではないため、ロジックをサービスに移動して2つのコントローラー間で共有したくありません。

それを行う他の方法はありますか?

26
Freewind

与えられた条件下で私は次のようなことをしているかもしれません

function MyCommonCtrl(type){
    return function($scope, $http) {
        $scope.x = 5;

        if(type = 't1'){
            $scope.domore = function(){
            }
        }

        ....
        ....
    }
}

angular.module('ng').controller('Type1Ctrl', ['$scope', '$http', MyCommonCtrl('t1')]);
angular.module('ng').controller('Type2Ctrl', ['$scope', '$http', MyCommonCtrl('t2')]);

次に

<div ng-controller="Type1Ctrl"></div>

そして

<div ng-controller="Type2Ctrl"></div>
16
Arun P Johny

特定の設定はわかりませんが、2つのコントローラーが共通の祖先から継承する可能性があります。

Type1Ctrl.prototype = new MyCtrl();
Type1Ctrl.prototype.constructor = Type1Ctrl;

function Type1Ctrl() {
  // constructor stuff goes here
}

Type1Ctrl.prototype.setScope = function() {
  // setScope
};

Type2Ctrl.prototype = new MyCtrl();
Type2Ctrl.prototype.constructor = Type2Ctrl;

function Type2Ctrl() {
  // constructor stuff goes here
}

Type2Ctrl.prototype.setScope = function() {
  // setScope
};
6
axzr

私も同様の問題に直面し、スコープの継承によって問題が解決しました。コントローラーを「再利用」して、共通の状態/モデル($ scope)と機能($ scopeにアタッチされたコントローラー関数)を継承したかった "Scope Inheritance Example" で説明されているように親コントローラーをにアタッチします外側のDOM要素と内側の子コントローラー。親コントローラーのスコープと機能は、子コントローラーにシームレスに「マージ」されます。

3

別のオプションがあります。 このブログ投稿 から少し変更

app.factory('ParentCtrl',function(){
    $scope.parentVar = 'I am from the parent'
  };
});

app.controller('ChildCtrl', function($scope, $injector, ParentCtrl) {
  $injector.invoke(ParentCtrl, this, {$scope: $scope});
});

ここにプランカーがあります

3
AgDude