2014-07-05 39 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中被调用时,上下文不会改变。