2014-12-19 157 views
1

我使用角度路由,我有一种情况,其中两个视图基本上操纵相同的数据。现在,数据通过工厂提供给两个控制器。但是,功能完全相同。AngularJS - 控制器继承

我不会去太多的细节,但创建一个服务或工厂(在这种情况下,一般建议)并没有解决我的问题,因为按钮点击等基本上都是在这两种观点是相同的。我仍然必须定义相同的按钮点击两次,除了逻辑将在工厂。我的两个意见唯一的区别是,view2有几个功能比view1更多,否则它基本上是相同的。

我现在需要的是某种控制器继承。我找到了几个解决方案,但我仍在寻找一个最佳和正确的解决方案。我用angular.extend来克隆范围,但我不确定这是否是正确的方法。

此外,$scopeview1发生什么?当它被克隆到$scopeview2?它是否被覆盖?

这里有一个简单的例子:http://jsbin.com/fiqeha/1/edit?html,js,output

+0

你不能使用这两种观点相同的控制器?否则,你会麻烦注入服务/工厂到两个控制器。 –

回答

4

可以通过声明基本为厂家和使用$注射器例如它们注入到你的控制器实现控制器继承

angular.module('app').factory('BaseController', function() { 

    var controller= function($scope){ 

    $scope.value = 0; 

    $scope.testFunction = function() { 
     $scope.value++; 
    }; 

    $scope.overrideFunction = function() { 
     $scope.value--; 
    } 
    } 

    return controller; 
}); 

,并在子控制器,

angular.module('app').controller('ChildController', function ($scope, 
    $injector, BaseController) { 

    //Inherit base controller - first line in controller 
    $injector.invoke(BaseController, this, {$scope: $scope}); 

    $scope.overrideFunction = function() { 
    //call base function 
    $scope.value = $scope.testFunction() + 2; 
    }; 

}); 
0

为什么不使用相同的控制器?你会得到两个独立的控制器实例,这应该是你想要的。

这是fork of your jsbin

JS:

angular.module('app', []). 
controller('ctrl1', ['$scope', function($scope){ 

    $scope.name = "John"; 

    $scope.displayName = function(){ 
     alert($scope.name); 
    }; 

    $scope.getNameLength = function(){ 
     alert($scope.name.length); 
    }; 

}]); 

HTML:

<body> 
    <b>view1.html</b> 
    <div ng-controller="ctrl1"> 
     <input ng-model="name" /> 
     <button ng-click="displayName()">Display</button> 
    </div> 
    <br /> 
    <br /> 
    <b>view2.html</b> 
    <div ng-controller="ctrl1"> 
     <input ng-model="name" /> 
     <button ng-click="displayName()">Display</button> 
     <button ng-click="getNameLength()">Length</button> 
    </div> 
</body> 
+0

是的,这也是我最初的解决方案,但后来变得非常混乱,因为view2至少有五种特定的方法。而且也不需要包含view1。我的例子错了吗? – uglycode

+0

它是你,但有5个额外的方法将是一个令人信服的理由尝试某种形式的继承。可以制作2个不同的控制器并复制一些方法(将复杂的逻辑移动到服务),或者拥有2个相同的控制器。 –

+0

谢谢你的回应。我仍在努力理解为什么原始帖子中的例子可能不是一个好的解决方案,或者如果我通过从一个控制器复制范围来打破任何角度规则? – uglycode