Как запретить backbone.js делиться событиями в представлении потомков - PullRequest
1 голос
/ 14 марта 2012

У меня есть главный вид для создания списков. это представление имеет событие щелчка, чтобы «загрузить больше элементов».
У меня есть два дополнительных представления, расширяющих основной вид.
Моя проблема заключается в том, что, когда я нажимаю на кнопку «Загрузить еще» в одном представлении, это влияет на другое представление (если оно было загружено ранее). Я понимаю, что необходимо закрыть представления перед инициализацией другого, но поскольку мои представления расширяют главное представление, этот метод не будет работать (он закрывает главный объект, а другие дочерние представления не будут инициализироваться):

Backbone.View.prototype.close = function(){
  this.remove();
  this.unbind();
}

мой главный вид:

App.Views.List = Backbone.View.extend({
    events: {
        'click .load-btn' : 'loadMore'
    },
    loadMore: function(e)
    {
        this.collection.increase().fetch({
            add: true
        });
        e.preventDefault();
    }  
}

обратите внимание, что .increase - это пользовательский метод для увеличения параметра api.

дочерний вид:

App.Views.Projects = App.Views.List.extend({
    initialize: function()
    {
        this.itemView = App.Views.Project;
        this.collection = new App.Collections.Projects();
        this.parent('initialize');
    },
    render: function()
    {
        this.template = _.template(App.Tpl.get('projects.list'));
        this.parent('render');
    }
});

обратите внимание, что .parent - это пользовательский метод для вызова методов главного представления.
поэтому, когда я нажимаю кнопку «Загрузить больше» в представлении, он пытается вызвать методы loadMore для всех представлений, выходящих из основного представления, если они уже инициализированы.

Что мне делать?

Ответы [ 2 ]

1 голос
/ 14 марта 2012

App.Views.Projects расширяет App.Views.List и не определяет события, поэтому он наследуется от родительского представления.Это будет означать, что все элементы .load-btn в представлении проекта имеют установленный обработчик.

Возможно, вы могли бы исправить это, добавив пустой хэш событий в представление проекта, т.е.

App.Views.Projects = App.Views.List.extend({
  events: {},
  initialize: function()
  ...
});
0 голосов
/ 14 марта 2012

Используйте e.stopPropagation () вместо предотвращения по умолчанию. Это помогло мне с подобной проблемой.

...