2011-10-05 30 views
8

我有以下模板:Backbone js:如何刪除額外的標籤?

<div class="row"> 
    <div></div> 
    .... 
</div> 

及以下觀點:

var TestView = Backbone.View.extend({ 
    tagName: "div", 
    template: $("#tests_template"), 
    initialize: function() { 
     _.bindAll(this, 'clickbtn'); 
    }, 
    events: 
    { 
     "click .btn": "clickbtn" 
    }, 
    render: function() { 
      .... 
      { 
     }); 

的問題是,它產生以下輸出:

<div><div class="row">...</div></div> 

如何擺脫外部div?我試圖從視圖中刪除tagName屬性,但它仍然放置一個div?

回答

10

更改模板擺脫外的div:

<div></div> 
    .... 

然後,告訴視圖與類名創建DIV:

tagName: "div", 
className: "row" 

OR,如果你想保留當前模板,然後告訴View使用哪個el(假設它已經存在於您的頁面上的某個地方):

var testView = new TestView({el: $(".row")}); 

編輯你問你是否可以在初始化程序中做到這一點?當然,但你需要確保你鉤事件:

initialize: function() { 
    this.el = $(".row"); 
    this.delegateEvents(); 
    _.bindAll(this, 'clickbtn'); 
} 

老實說,雖然,前兩個選項都比較脫鉤IMO。

+0

有沒有辦法將它分配給初始化器? var TestView = Backbone.View.extend($('。row')etc? – firebird

+0

您可以隨時在初始化程序中設置this.el,但到那時,所有的事件都已經連接起來, d不得不調用'this.delegateEvents()'(參見編輯)如果你不想傳遞它,你可以在調用「super」之前覆蓋構造函數並在那裏執行。 –

3

,不需要修改模板是使用另一種選擇setElement

setElement view.setElement(元素)

如果你想用骨幹視圖適用於不同的DOM元素,使用setElement,它還會創建緩存的$ el引用,並將視圖的委託事件從舊元素移動到新元素。

這將允許您完全繞過tagName。您可以將tagName留在您的視圖定義中(無論如何它默認爲div)。您也不必擔心手動委託您的事件,或者需要事先知道@Brian Genisio的答案中提到的元素選擇器,儘管這些其他方法也可以工作。

render: function() { 
    this.setElement(this.template(this.model.toJSON())); 
    return this; 
} 
+0

你錯過了一個支架這裏:'''this.setElement(this.template(this.model.toJSON()));''' –

+1

編輯它來修復缺少的括號,謝謝! –