26

コントローラーを 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 つのコントローラー間でロジックを共有するためにロジックをサービスに移動したくありません。これは、ロジックがサービスとして一般的ではないためです。

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

4

4 に答える 4

17

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

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>
于 2013-03-25T15:30:25.600 に答える
6

特定の設定はわかりませんが、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
};
于 2013-03-26T09:11:09.833 に答える
3

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

于 2014-01-20T00:35:03.290 に答える
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});
});

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

于 2014-06-30T19:18:07.780 に答える