Метод рендеринга из базового класса вызывается в магистрали

У меня есть панель поиска:

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,

Другие вопросы по тегам