2014-07-16 132 views
0

我想包括我的骨幹一個可選的參數視圖的渲染功能,像這樣:語境問題與骨幹視圖渲染功能

var AppView = Backbone.View.extend({ 
     el: '#app', 

     initialize: function(){ 
       _.bindAll(this,'render'); 
       this.listenTo(app.collection.sellables,'reset', this.render); 
     }, 

     render: function(sellableId){ 
       if(typeof sellableId == "undefined"){ 
         var sellable = app.collection.sellables.first(); 
       } 
       else{ 
         var sellable = app.collection.sellables.get(sellableId); 
       } 
       var view = new SellableView({model: sellable}); 
       this.$('#sellables').append(view.render().el); 
     }, 
}); 

第一次遇到這種觀點呈現,它發生的原因app.collection.sellables收集得到從服務器收到一些數據後重置。發生此重置時,視圖的渲染函數會被調用,但不會被sellableId調用爲未定義,而是sellableId等於app.collection.sellables變量,這會導致錯誤。爲了澄清,視圖的渲染功能是被稱爲正因爲如此:

app.collection.sellables.reset(data.skus); 

爲什麼我的渲染功能是接收集合作爲參數,而不是論據是不確定的?

另外,如果我手動渲染視圖,它工作正常,並如預期的那樣sellableId說法是不明確的:

var app.view.app = new AppView; 
app.view.app.render(); 

回答

0

你結合你的render"reset"就在這裏:

this.listenTo(app.collection.sellables,'reset', this.render); 

來自Catalog of Events

  • 「重置」(集合,選項) - 集合的全部內容已被替換。

所以對於一個"reset"事件的處理程序始終獲取集合作爲第一個參數。請記住,JavaScript函數的參數是在調用函數時確定的,而不是函數的定義。

您有幾個選項。你可以綁定別的東西給"reset"事件:

initialize: function() { 
    //... 
    this.listenTo(app.collection.sellables, 'reset', this.been_reset); 
}, 
been_reset: function() { 
    this.render(); 
} 

你可以離開render不帶參數(如標準render),並有一個單獨的函數來處理參數:

render: function() { 
    return this.append_model(app.collection.sellables.first()); 
}, 
append_model: function(sellable) { 
    var view = new SellableView({model: sellable}); 
    this.$('#sellables').append(view.render().el); 
    return this; 
} 

然後你請致電view.append_model(app.collection.sellables.get(sellableId))添加特定型號。

+0

非常感謝,這非常有幫助。 – flyingL123