2012-11-06 68 views
1

我已經設置下劃線小鬍子模式,像這樣:循環的小鬍子模式下劃線模板

_.templateSettings = { 
    interpolate : /\{\{(.+?)\}\}/g 
}; 

我有一個模板的一部分有以下:

<script id="detail_view" type="text/template"> 
    <% for(registration in REGISTRATION_NUMBERS){ %> 
     <tr> 
      <td>{{registration.TYPE}}</td> 
      <td>{{registration.VALUE}}</td> 
     </tr> 
<% } %> 
</script> 

導致「註冊未定義」。使用this會導致整個部分輸出到模板中。我究竟做錯了什麼?

回答

4

你有兩個問題,一個你知道,一個你不知道。

第一個問題是,如果您只想替換其中的一個,則將替換全部三個_.templateSettings。你想這樣的:

_.templateSettings.interpolate = /\{\{(.+?)\}\}/g; 

這將先不談evaluateescape部分_.templateSettings。你在做什麼是一樣的:

_.templateSettings = { 
    interpolate : /\{\{(.+?)\}\}/g, 
    evaluate : undefined, 
    escape  : undefined 
}; 

所以你沒有evaluate都結束了。順便說一句,您可以查看已編譯模板函數的source屬性以查看您的模板編譯爲的JavaScript,但JavaScript並非那麼容易,但看着它可以幫助解決這類問題。

您不知道的問題是for...in循環用於迭代對象的屬性,而不是數組中的值。這意味着registration將會是字符串'0''1',...在你的循環內,這不是你想要的。你需要像這樣在你的模板,如果REGISTRATION_NUMBERS是一個數組:

<% for(var i = 0; i < REGISTRATION_NUMBERS.length; ++i) { %> 
    <% var registration = REGISTRATION_NUMBERS[i]; %> 
    <tr> 
     <td>{{registration.TYPE}}</td> 
     <td>{{registration.VALUE}}</td> 
    </tr> 
<% } %> 

或者,因爲你有下劃線周圍反正,你可以使用_.each

<% _(REGISTRATION_NUMBERS).each(function(r) { %> 
    <tr> 
     <td>{{r.TYPE}}</td> 
     <td>{{r.VALUE}}</td> 
    </tr> 
<% }) %> 

演示:http://jsfiddle.net/ambiguous/jfckA/

+0

for循環最適合數組,_()。each僅用於集合? –

+0

@NicholasMurray:'_.each'的形式是針對一個數組的,您希望'_(obj).each(function(value,key){...})'爲一個非數組對象,note回調函數的參數順序。我發現'_.each'比模板中的'for(;;)'循環少噪音。 –

+0

感謝您澄清,您剛剛聽到的聲音是我轉換爲_.each循環,謝謝 –