Позвоночник.JS listenTo window resize throwing [object Object] не имеет ошибки метода " применить

:

Я пытаюсь прикрепить событие изменения размера к окну из представления, используя новый метод listenTo () в магистрали.js. Кажется, что событие привязывается к окну, однако, когда окно фактически изменяется, возникает следующая ошибка:

непойманные ошибку TypeError: объект [объект] не имеет метода 'применить' на jQuery.ДШ:2 стр. событие.отправка на jQuery.ДШ:2 стр. событие.добавлять.г.ручка.h

вот код, который присоединяет событие к представлению:

this.listenTo($(window),"resize", this.resizeContext, this));

вот функция resizeContext:

  resizeContext: function(event) {

            console.log("resizing context for "+this.id);

            this.setHeight();

            // trigger resize event (use event bus)
            this.options.vent.trigger("resize", event);

        }

Примечание: используя стандартный $(window).on("resize",this.resizeContext) присоединяет событие и работает так, как должно. Я пытаюсь воспользоваться новым stopListening() функция, которая добавляется к view.remove();

3 ответов


новая listenTo и stopListening методы Backbone.Events mixin, и они могут использоваться только для прослушивания событий магистрали, которые запускаются с .trigger, например, встроенный collection:add или model:change событий.

это означает, что вы не сможете использовать stopListening функциональность для событий DOM, таких как window:resize.

попробуйте переопределить View.remove метод вместо этого.

var SomeView = Backbone.View.extend({
  initialize:function() {
    $(window).on("resize",this.resizeContext)
  },

  remove: function() {
    $(window).off("resize",this.resizeContext);
    //call the superclass remove method
    Backbone.View.prototype.remove.apply(this, arguments);
  }
});

если вы хотите продолжать использовать listenTo вы можете использовать следующую одну оболочку для элементов DOM:

/**
 * Use Backbone Events listenTo/stopListening with any DOM element
 *
 * @param {DOM Element}
 * @return {Backbone Events style object}
 **/
function asEvents(el) {
    var args;
    return {
        on: function(event, handler) {
            if (args) throw new Error("this is one off wrapper");
            el.addEventListener(event, handler, false);
            args = [event, handler];
        },
        off: function() {
            el.removeEventListener.apply(el, args);
        }

    };
}

пример:

view.listenTo(asEvents(window), "resize", handler);

и слушатель будет автоматически удален на view.remove() или view.stoplistening()

вот более сложная реализация для нескольких прослушивателей событий https://gist.github.com/epeli/5927950


в моем коде мне нужно сделать .debounce ((это.resizeContext).bind(this)).

что затрудняет отключение. В качестве грязного решения я просто отключаю все прослушиватели "изменения размера" при удалении представления. Я думаю, в новом представлении, если есть прослушиватель изменения размера, он будет включен снова.

remove: function() {
    $(window).off("resize");
    //call the superclass remove method
    Backbone.View.prototype.remove.apply(this, arguments);
}