簡體   English   中英

如何為2個不同的視圖重用一個控制器?

[英]How to reuse one controller for 2 different views?

我已經定義了一個控制器,並將其應用於兩個視圖,差別很小。

角度代碼:

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個控制器之間共享它,因為邏輯並不是服務的常見邏輯。

還有其他辦法嗎?

在給定的條件下,我可能會做類似的事情

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>

我不知道你的具體設置,但你的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
};

我也面臨類似的問題和范圍繼承解決了我的問題。 我想“重用”一個控制器來繼承公共狀態/模型($ scope)和功能(附加到$ scope的控制器函數)如“范圍繼承示例”中所述,我將父控制器附加到外部DOM元素和子控制器內心的。 父控制器的范圍和功能無縫地“合並”到子控制器中。

這是另一種選擇。 這篇博客文章略微修改

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

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

這是一個吸煙者

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM