Метод рендеринга из базового класса вызывается в магистрали
У меня есть панель поиска:
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()
метод никогда не вызывается после обновления фильтра.
Проверка в отладчике показывает, что render()
метод Backbone.View
(класс прародителя) называется. Я в замешательстве, так как я использовал эту же технику в другом виде, и она отлично работает.
РЕДАКТИРОВАТЬ:
это в updateFilter относится к App.searchBar
, не App.Views.PartnerCompanies
пример.
1 ответ
Как вы говорите в своем редактировании, this
в updateFilter()
это пример App.searchBar
не App.Views.PartnerCompanies
, В результате, когда вы звоните this.render()
в updateFilters
это называется на App.searchBar
пример. App.searchBar
не имеет render()
и его родитель тоже App.Views.SearchField
, Но App.Views.SearchField
наследуется от Backbone.View
, который делает. Вот почему ваш метод вызывает позвоночник render()
метод.
Таким образом, проблема в том, что this
не относится к вашему App.Views.PartnerCompanies
, Это должно быть легко исправить. Если вы поменяете свой _.bindAll
а также setFilterCallback
линии в вашем App.Views.PartnerCompanies
, тебе должно быть хорошо идти. Таким образом, вы связываете свой this
переменная перед назначением его в качестве обратного вызова, поэтому контекст не изменится, когда он будет вызван в updateFilter
,