2014-01-31 39 views
3

想象我有這樣的事情:有兩個共享相同DOM元素的Angular控制器是不好的做法嗎?

<html ng-app="myApp"> 
    ... 
    <body ng-controller="GlobalController"> 
     <div id="one">...</div> 
     ... 
     <div ng-controller="SpecificController" id="subPart"> 
      <div id="two">...</div> 
      ... 
     </div> 
     ... 
    </body> 
</html> 

正如你所看到的,控制器GlobalController管理整個身體,而SpecificController只控制subPart

在這種情況下,div#one可以訪問到GlobalController,但div#two鏈接到GlobalControllerSpecificController

我的問題是要知道,如果這是一個不好的做法,這樣做,因爲我想,有2個控制器對於相同的DOM元素(如div#two)可能會導致衝突......

而且,如果它是不是一個壞習慣,在這種情況下我該怎麼照顧?例如,我想我必須小心以避免在兩個控制器中具有相同的屬性,對嗎?

謝謝。

ps:我不確定這個問題是否被問過。我多次看到「我可以在同一頁面上有兩次相同的控制器」的問題,但這不是我的問題。

回答

4

沒有什麼錯誤在我看來,你只是表明你的控制器之間有一個「繼承」鏈,它允許對DOM的某些方面進行更精細的控制,這可能與無關整個頁面。

您將共享屬性是正確的,隨着孩子的控制器將繼承它的屬性父控制器:

function ParentCtrl($scope) { 
    $scope.test = "One"; 
} 

function ChildCtrl($scope) { 
    console.log($scope.test); // Logs "One"; 
    $scope.test = "Two"; // We've re-defined the variable as "Two" 
} 

不過,我會盡量做到言自明的代碼SpecificController確實繼承GlobalController爲了避免數據屬性的衝突。

+0

事實上,我感覺我的'div#two'不能與'GlobalController'上的'$ scope.foo'屬性進行交互。我試圖創建一個JsFidlle來確定,並且我將編輯我的問題... – romaintaz

+0

爲什麼'SpecificController'繼承自'GlobalController' - 它不共享'div#one'? – Bergi

+0

@romaintaz'div#two'繼承由'GlobalController'定義的任何屬性,因爲它是嵌套的 - http://jsfiddle.net/Yu8ZW/ – CodingIntrigue

0

我經常發現,如果試圖將所有內容都保存在單個控制器中,特別是對於大頁面,那麼控制器的大小可能變得難以管理,因此實際上我偏好使用父 - 子控制器繼承。請記住,在引用子DOM元素的父屬性時,需要謹慎對待父屬性命名策略,或者在需要引用時在子DOM中使用$ parent.parentproperty。

相關問題