26

我已经定义了一个控制器,并将其应用于 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>

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

View 1 和 View 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 回答