如何为2个不同的视图重用一个控制器?

时间:2013-03-25 15:05:40

标签: angularjs angularjs-controller

我已定义了一个控制器,并将其应用于两个视图差异较小的视图。

角度代码:

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>

示例代码非常简单,但我的实际项目中有很多代码和逻辑。

View 1和2具有几乎相同的功能,只有一些差异,但我确实需要在控制器中为每个功能编写一些代码。

我不想为它们创建2个不同的控制器,因为它们具有大部分相同的逻辑。我不想将逻辑移动到服务以在2个控制器之间共享它,因为逻辑并不是服务的常见逻辑。

还有其他办法吗?

4 个答案:

答案 0 :(得分:16)

在给定的条件下,我可能会做类似

的事情
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>

答案 1 :(得分: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
};

答案 2 :(得分:3)

我也面临类似的问题和范围继承解决了我的问题。 我想“重用”一个控制器来继承公共状态/模型($ scope)和功能(附加到$ scope的控制器函数) 如"Scope Inheritance Example"中所述,我将父控制器附加到外部DOM元素,将子控制器附加到内部。父控制器的范围和功能无缝地“合并”到孩子中。

答案 3 :(得分:3)

这是另一种选择。稍微修改自this blog post

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

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

here is a plunker