2015-05-31 55 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

相關問題