2012-08-17 50 views
5

所以我剛開始使用AngularJS,除了一個小小的障礙之外,它看起來非常好。比方說,我有兩個指令,其中一個需要其他的,像這樣:AngularJS:templateUrl推遲控制器的構建,依賴代碼中斷

<outer> 
    <inner></inner> 
</outer> 

如果inner.htmlouter.html負載,那麼有沒有:

angular.module('components', []) 
    .directive('outer', function() { 
     return { 
      restrict: 'E', 
      replace: true, 
      transclude: true, 
      scope: {}, 
      link: function(scope) { ... }, 
      controller: function($scope) { ... }, 
      templateUrl: 'outer.html' // Note this 
     }; 
    }) 
    .directive('inner', function() { 
     return { 
      require: '^outer', // And this 
      restrict: 'E', 
      ... 
      link: function(scope, element, attrs, outerCtrl) { ... }, 
      templateUrl: 'inner.html' 
     }; 
    }); 

在HTML像這樣用問題。<outer>被正確轉換,並被分配一個範圍和一個控制器,並且<inner>收到該控制器就好了。

如果模板負載以相反的順序,然而<inner>已創建<outer>的控制器之前被鏈接,並且它失敗,錯誤消息‘錯誤:沒有控制器:外’

我已經嘗試將服務器端負載延遲附加到inner.html,只要首先加載outer.html,任何地方都沒有問題。同樣,如果我內嵌outer的模板(即使用template而不是templateUrl),那麼該模板將首先變得可用,並且這一切都非常出色。

有誰知道使用templateUrl的方法是否需要其他指令?在我的實際代碼中,至關重要的是內部指令可以訪問外部控制器,並且寧願templateUrl而不是template,因爲前者將佈局與行爲分開,並且即使在行爲之後也可以更容易地配置模板代碼已經變大了。

在此先感謝,並對不起,如果這已經問過;我無法在Stack Overflow上找到任何等效的問題。

回答

2

當您在同一個模塊中定義多個指令時,您可以指定一個優先級來處理指令的執行順序。在你的情況下,給予'外'優先的內在。因此,無論何時載入模板,指令都按順序執行。

查看directive中的'指令定義對象'以獲取更多解釋。

我希望有答案。

但是,當您說'外部'控制器取決於'內部'控制器時,它看起來不太好。我個人認爲,控制器不應該與其他控制器捆綁在一起。我不確定你的用例,但是應該有辦法打破兩個控制器之間的依賴關係。

+0

我有這個確切的問題,但沒有調整優先級幫助(不在1.0.5上,而不是在1.0.7上)。在我的情況下,這是'內在'取決於'外部'的控制器,並且沒有簡單的方法來打破這種依賴關係,因爲我有幾個'內在',做一些事情需要一些東西發生在別人身上(這是一種高級手風琴) 。 – ivarni 2013-08-09 12:21:59