2014-07-05 81 views
0

我有一個搜索欄視圖:渲染從基類的方法被稱爲在骨幹

App.Views.SearchField = Backbone.View.extend({ 
    events: { 
     'keyup' : 'setFilter' 
    }, 

    setFilter: function() { 
     if (typeof this.filterCallback === 'function') { 
      var filter = this.$el.val(); 
      this.filterCallback(filter); 
     } 
    }, 

    setFilterCallback: function(filterCallback) { 
     this.filterCallback = filterCallback; //debounce here 
    } 
}); 

其實例化:

App.searchBar = new App.Views.SearchField({ 
    el: $('[data-role="top-search"]') 
}); 

我連接到它從另一個視圖的初始化:

App.Views.PartnerCompanies = App.Views.baseView.extend({ 

initialize: function(options) 
{ 
    this.filter = ''; 
    App.searchBar.setFilterCallback(this.updateFilter); 
    _.bindAll(this, "updateFilter"); 
} 

render: function() { 
console.log('rendering partnercompanies list'); 
// get data and show it. 
} 

updateFilter: function(filter) { 
    console.log('filter updated'); 
    this.filter = filter; 
    this.render(); 
}, 

但它不起作用。

輸出是:過濾器更新後不會被調用

rendering partnercompanies list 
filter updated [multiple times] 

render()方法。

在調試器中檢查顯示Backbone.View(祖父類)的render()方法正在被調用。我很困惑,因爲我在另一種觀點中使用了相同的技術,並且工作正常。

編輯:

這updateFilter指App.searchBar,而不是App.Views.PartnerCompanies實例。

+0

你如何實例化你的App.Views.PartnerCompanies?如果你在'updateFilter()'方法中使用'console.log(this)',你會得到什麼? (你必須在結果對象中進行深入探索才能確定它是什麼;在登錄到控制檯時,Backbone對象不會顯示明顯的名稱。) –

+0

在原始問題中添加了編輯 –

回答

0

正如您在編輯中所說的,thisupdateFilter()App.searchBar的實例,而不是App.Views.PartnerCompanies。因此,當您在updateFilters中調用this.render()時,它將在App.searchBar實例上調用。 App.searchBar沒有render(),也沒有其父母App.Views.SearchField。但是App.Views.SearchField繼承自Backbone.View,它的確如此。 這就是爲什麼你的方法調用Backbone render()方法。


所以根本上說,問題是,this是不是指你的App.Views.PartnerCompanies。這應該是一個簡單的修復。如果您將_.bindAllsetFilterCallback換成您的App.Views.PartnerCompanies,那麼您應該很好。這樣,你在之前將this變量分配爲回調,所以當它在updateFilter中被調用時,上下文不會改變。