2015-05-31 53 views
3

我正在建设的应用程序有多个视图,每个都有自己的控制器。我的所有控制器都以相同的方式启动,并在一种方法上有所不同DRYing控制器与指令与服务

$scope.a = ...    // same for all controllers 
$scope.b = ...    // same for all controllers 
$scope.c = function(){...} // same for all controllers 

$scope.d = function(){...} // is different for each controller 

他们说保持你的控制器精简和分解他们的服务。 但是,如果我把a,b,c放在一个服务中,它们将在所有的控制器之间共享,我希望每个控制器在其自己的范围内保留它自己的a,b,c。 我不想分享数据,只是代码。

所以我创建了一个引用父范围并在自己的控制器中声明常用东西的指令。它解决了我的问题,但有没有最佳做法可以推荐?

+0

听起来像是你的代码是有状态的它可能在数据留在控制器本身里面最好的服务代码是无状态的,因此在多个控制器共享(除非有必要在多个控制器之间共享数据,如主数据不会变化太多)。 –

回答

3

如果您将控制器方法定义为范围属性,则可以使用简单的mixin方法来使用常用方法扩展每个范围对象。

说你定义一个可重复使用的方法的对象:

var mixin = { 
    a: function() { return this.name; }, 
    b: function() {}, 
    c: function() {} 
}; 

,然后当你需要这些方法,您只需将它们混合到当前$scope

app.controller('Controller1', function($scope) { 

    $scope.name = 'One'; 

    // Create common methods 
    angular.extend($scope, mixin); 

    // Define unique method 
    $scope.d = function() {}; 
}); 

里面混入方法this将指向个人$scope对象。

下面是该方法的演示。

演示:http://plnkr.co/edit/Vc00GsRTi5d6VNcILsva?p=preview

+0

这是一个很好的方法,你可以说它比使用指令更好/更差吗? – TKrugg

+0

对于我这种类型的功能使用指令是不正确的。这是更多的架构模式问题,而不是具体的工具问题。所以使用指令对我来说并不理想,再加上使用Angular指令来定义方法会带来额外的开销。这是真正的古典继承问题,但在Angular领域。所以你有很多可能性如何扩展一个类的基础。在这种情况下,我使用了mixin,但你也可以使用原型继承,或者借用构造函数,甚至是构图模式。但对我来说,mixin是简单而优化的。 – dfsq

相关问题