2013-03-07 20 views
61

在這個頁面:http://docs.angularjs.org/guide/directive如何理解指令的`terminal`?

指令定義對象

終端

如果設置爲true,那麼當前的首要任務將是最後一組將執行指令(在當前的優先級任何指示將仍然執行,因爲相同優先級的執行順序未定義)。

我不太明白。 current priority是什麼意思?如果有這樣的指示:

  1. 指令1含{優先權:1,終端:假}
  2. 指令2與{優先權:10,終端:假}
  3. directive3含{優先權:100,終端:假}
  4. directive4與{優先級:100,終端:真正} //這是真的
  5. directive5與{優先級:1000,終端:假}

請注意directive4terminal:true和其他人有false

如果有一個HTML標籤已全部5個指令:

<div directive1 directive2 directive3 directive4 directive5></div> 

什麼是5個指令的執行順序?

回答

141

優先

優先級,當你有一個元素上的多個指令纔有意義。優先級決定了這些指令將以何種順序應用/啓動。在大多數情況下,您不需要優先級,但有時在使用編譯函數時,您需要確保編譯函數首先運行。

終端

終端屬性也只對是相同的HTML元素指令相關。也就是說,如果您在my-directive1my-directive2指令中有<div my-directive1></div> <div my-directive2></div>,priorityterminal不會相互影響。如果你有<div my-directive1 my-directive2></div>,他們只會互相影響。

terminal屬性告訴Angular跳過該元素後面的所有指令(較低優先級)。所以這個代碼可能會清除掉:

myModule.directive('myDirective1', function() { 
    return { 
     priority: 1, 
     terminal: false, 
     link: function() { 
      console.log("I'm myDirective1"); 
     } 
    } 
}); 

myModule.directive('myDirective2', function() { 
    return { 
     priority: 10, 
     terminal: true, 
     link: function() { 
      console.log("I'm myDirective2"); 
     } 
    } 
}); 

myModule.directive('myDirective3', function() { 
    return { 
     priority: 100, 
     terminal: false, 
     link: function() { 
      console.log("I'm myDirective3"); 
     } 
    } 
}); 

對於這一點,你只看到「我myDirective2」,並在控制檯「我myDirective3」。

<div my-directive1 my-directive2 my-directive3></div> 

但是,對於這一點,您會看到「我是myDirective1」,因爲它們位於不同的元素上。

<div my-directive1></div> 
<div my-directive2></div> 
<div my-directive3></div> 

原帖

在你的榜樣,優先100和1000的指令都將得到應用,因​​爲具有較高優先級的指令會先應用唯一的,所以一個優先1000將首先應用。

如果在這種情況下您有兩個優先級爲100的指令,則兩個指令都將被應用,因爲具有相同優先級的指令的順序未定義。

請注意,這僅適用於位於同一元素上的指令。

+1

謝謝,但你沒有提到'terminal'(指令4)。如果html標籤包含所有5個指令,那麼順序是什麼? – Freewind 2013-03-07 09:19:24

+3

我已經用一些希望清除事情的例子更新了我的答案。 – 2013-03-07 09:31:30

+0

更清晰,謝謝。還有一個小問題:如果在標籤「

」中有'my-directive4'具有'{priority:10,terminal:false}'怎麼辦?它應該始終運行,但它可能在'my-directive2'之前或之後,對吧? – Freewind 2013-03-07 09:50:30