2012-04-26 108 views
0

我已經制作了兩個文件,一個用於HTML,其中腳本使用id ='search_template'定義,另一個javaScript文件是我提到的「視圖」。jQuery無法呈現html以供下劃線的模板使用

鑑於渲染功能,我拿起在HTML文件中的腳本使用jQuery

id='search_template'

並使其通過的jQuery的

.html()

將其轉換成字符串,然後將它傳遞給下劃線的

_.template (String)

但是,Underscore會拋出錯誤

遺漏的類型錯誤:無法調用空

的「替換」我相信jQuery是無法腳本轉換用id =「search_template」爲String。

SearchView = Backbone.View.extend({ 
     initialize: function(){ 
     _.bindAll(this, 'render'); 
     }, 
     render: function(){ 
     var template = _.template($("#search_template").html()); 
     $("body").html(template); 
     } 
    }); 
var search_view = new SearchView({ el: $("#search_container") }); 
    search_view.render(); 

我刪除了jQuery的部分從渲染功能,並通過明確地傳遞HTML字符串不使用的.html()函數嘗試: -

render: function(){ 
    var template = _.template("<label><%= search_label %></label> 
    <input type=\"text\" id=\"search_input\" /> 
    <input type=\"button\" id=\"search_button\" value=\"Search\" />"); 
    $("body").html(template); 
} 

這工作完全正常。 爲什麼當我使用jQuery來拾取使用$(「search_template」)的腳本時,它不起作用。 另外,當我合併HTML和JavaScript文件它的作品。 下面是HTML文件中的一個片段: -

<script type="text/template" id="search_template"> 
<label>Search here : </label> 
<input type="text" id="search_input" /> 
<input type="button" id="search_button" value="Search" /> 
</script> 

回答

0

也許你需要傳遞的對象與調用模板一起:

var template = _.template($("#search_template").html(), { search_label: "Label1" }); 
1

render

render: function(){ 
    var template = _.template($("#search_template").html()); 
    $("body").html(template); 
} 

不工作因爲在調用DOM時沒有#search_template。這裏的一些證據,如果你不相信我:http://jsfiddle.net/ambiguous/HFYyx/

你有一個錯字或地方的順序問題:

  1. 如果你還沒有包括在HTML #search_template,然後修復的HTML。
  2. 如果您在#search_template位於DOM中之前運行render,則將您的render調用放入$(function() { ... })包裝中,以便在DOM準備好之前不會調用它。
  3. 如果您在id中有錯字,請修復您的錯字。

這些將是您的問題最常見的原因。


順便說一句,_.template返回功能(除非您還通過它的第二個參數):

template_.template(templateString, [data], [settings])

Compiles JavaScript templates into functions that can be evaluated for rendering.
[...]
If you're writing a one-off, you can pass the data object as the second parameter to template in order to render immediately instead of returning a template function.

所以你應該叫template並使用其返回值作爲HTML:

$('body').html(template()); 
// --------------------^^ 
0

使用此項:

$(function() { 
    var search_view = new SearchView({ el: $("#search_container") }); 
    search_view.render(); 
}