1

我正在嘗試使用backbone.js和underscore.js創建一個頁面。我希望頁面有一個按鈕,當按下時,使用我定義的模板將表單的內容添加到頁面上的空標籤。與backbone.js一起使用下劃線模板

這裏是我的空標籤,我想按下按鈕後,模板的東西去:

<div id="playView"></div> 
<input type="button" id="addQuestion" value="Add Question" /> 

這裏是我的模板,其中表單數據應該去:

<script id="viewTemplate" type="text/template"> 
    <div id="stemView">{{ Stem }}</div> 
    <label for="answer1"> a)</label><div>{{ answer1View }}</div> 
    <label for="answer2"> b)</label><div>{{ answer2View }}</div> 
    <label for="answer3"> c)</label><div>{{ answer3View }}</div> 
    <label for="answer4"> d)</label><div>{{ answer4View }}</div> 
</script> 

而這裏的形式用戶將填寫:

<form> 
    <textarea id="stem"><textarea> 
    <textarea id="answer1"></textarea> 
    <textarea id="answer2"></textarea> 
    <textarea id="answer3"></textarea> 
    <textarea id="answer4"></textarea> 
</form> 

這裏是相關的backbone.js代碼。我的問題是,我該怎麼辦?我如何從窗體獲取數據,然後進入viewTemplate,然後進入空的div標籤(playView)?

wizard.PlayView = Backbone.View.extend({ 
    initialize: function() { 
     this.model.bind('change', _.bind(this.render, this)); 
    }, 
    el: '#playView', 

    events: { 
     'click button#addQuestion': 'addQuestion' 
    } 
    addQuestion: function() { 
     $(this.el).append(); 
    } 
}); 
+1

什麼是你正在使用的模板庫?語法看起來像車把 –

+0

下劃線,但我更改了模板規則以使用{{}} – SkyeBoniwell

+1

Sort-off-topic,但是,如果您使用Backbone版本> 0.9.0,則可以使用'this。$ el'而不是'$(this.el )'引用你的視圖元素,並且你可以使用this.model.on('change',this.render,this)'爲你的回調提供一個上下文,'bind'是'on'的別名。 – fbynite

回答

1

如果我理解正確,你現在有這個設置的方式,你就不會因爲輸入標籤需要在骨幹模板能夠觸發

events: { 
     'click button#addQuestion': 'addQuestion' 
    } 

。因此,爲了解決這個問題,黑骨模板將呈現頁面上的按鈕,然後監聽點擊按鈕。當點擊該按鈕,你將加載問題模板(這是嵌入在HTML頁面中,並插入到當前的骨幹模板。

<script id="viewTemplate" type="text/template"> 
    <div id="stemView">{{ Stem }}</div> 
    <label for="answer1"> a)</label><div>{{ answer1View }}</div> 
    <label for="answer2"> b)</label><div>{{ answer2View }}</div> 
    <label for="answer3"> c)</label><div>{{ answer3View }}</div> 
    <label for="answer4"> d)</label><div>{{ answer4View }}</div> 
</script> 

<script id="mainTemplate" type="text/template"> 
    <input type="button" id="addQuestion" value="Add Question" /> 
</script> 


wizard.PlayView = Backbone.View.extend({ 
    initialize: function() { 
     this.model.bind('change', _.bind(this.render, this)); 
    }, 

el: '#playView', 

template : _.template($('#mainTemplate').html()) 

events: { 
    'click button#addQuestion': 'addQuestion' 
} 

addQuestion: function() { 
    var t = _.template($('#stemTemplate').html(); 
    $(this.el).append(t(this.model.toJSON())); 
} 

render: function() { 
      $(this.el).append(this.template(this.model.toJSON())); 
     } 

}); 
+0

感謝您的代碼。所以你的代碼會修復我的事件?因此,無論何時按下「addQuestion」按鈕,viewTemplate都將填充表單中的數據,然後填充playView。謝謝 – SkyeBoniwell

+1

我的代碼將修復事件並觸發它。在這一點上,就像使用jQuery.append()將html插入模板一樣簡單。 – josephmisiti

1

您將首先構建包含數據的模型。

然後在視圖裏面,你會編譯模板第一

使用_.template編譯模板

wizard.PlayView = Backbone.View.extend({ 
     template : _.template($('#viewTemplate').html()) 
     initialize: function() { 
     // Use listenTo to bind events instead of directly 
     // listening on the model 
      this.listenTo(this.model, 'change', this.render); 
     }, 
     events: { 
      'click .addQuestion': 'addQuestion' 
     }, 
     addQuestion: function(e) { 
      var $target = $(e.target); 
      // Your logic here 
     }, 
     render: function() { 
      $(this.el).append(this.template(this.model.toJSON())); 
     } 

然後裏面的渲染視圖,你會在模型中通過與編譯模板一起,這將填充模型中的數據。

+0

噢好吧,我在我的模型中獲取數據,但按鈕事件怎麼樣?我現在不需要嗎?謝謝 – SkyeBoniwell

+1

@ 999cm999 ..創建一個事件散列並在其中添加事件。應該是好的..而且我相信你可能每個表單視圖都有1個按鈕。因此,使用'class'而不是'id'作爲ID應該是唯一的。檢查更新的文章 –