Backbone: 将事件附加到this.$el 并重新渲染导致绑定多个事件

Backbone: Attaching event to this.$el and re rendering causes multiple events to be bound

我需要将事件附加到主视图元素 this.$el。在这种情况下,它是一个 'LI'。然后我有时需要重新渲染这个视图。问题是如果我重新渲染它,它会在每次渲染时附加 onRender 方法中附加到 this.$el 的任何事件。因此,如果我调用 this.render() 3 次,处理程序将被附加 3 次。但是,如果我将事件附加到 this.$el 的子节点,则不会发生这种情况,并且事件似乎会自动取消委托并在每次渲染时重新添加。问题是在这种情况下我需要使用主要的 this.$el 元素。

这是一个错误吗? this.$el 的功能不应该像 childNodes 那样吗?我不应该在 this.$el 上附加东西吗?

视图内部:

onRender: function(){
    this.$el.on('click', function(){
    // do something
});

如果您可以use the view's event hash,您可以执行以下操作:

var Bookmark = Backbone.View.extend({
    events: {
        'click': function() {
            console.log('bound once')
        }
    }
    ...});

如果出于某种原因这不是一个选项,您可以 explicitly remove any existing event listeners for this event in the render method,这将防止监听器被多次附加:

var Bookmark = Backbone.View.extend({
    ...
    render: function(x) {
        this.$el.off('click.render-click');
        this.$el.html(this.template());
        this.$el.on('click.render-click', function () { 
            console.log('only ever bound once');
        });
        return this;
    }
});