Backbone 子视图事件未触发

Backbone subview events not firing

出于某种原因,我的视图事件没有触发,我不知道出了什么问题...

代码如下:

TasksView = ****.Views.BaseView.extend({
    id: 'log-container',
    className: 'row-fluid',
    initialize : function(){
        this.task_selection_view = new TaskSelectionView();
    },
    remove : function(){
        this.task_selection_view.remove();
        Backbone.View.prototype.remove.call(this);
    },
    render : function(){
        $(this.el).html(Templates['log/log']);
        $('#selection',this.el).append(this.task_selection_view.render().el);
        return this;
    }
});


TaskSelectionView = ****.Views.BaseView.extend({
    className : 'row-fluid',
    events : {
        'click #fire' : 'fire'
    },
    render: function(){
        $(this.el).html(Templates['log/task_selection']);
        return this;
    },
    fire : function(event){
        event.preventDefault();
        console.log('fire');
    }
});

log 模板:

<div id="selection"></div>

task_selection 模板:

<button id="fire" class="btn btn-default">fire</button>

我尝试了很多东西,但无法理解问题所在...

发生这种情况是因为您在不知不觉中解除了子视图事件的绑定。对 jQuery 的 .html() 的调用将在幕后调用 .empty(),这将分离绑定到(子视图的)元素的任何 DOM 事件。

这就是调用 this.delegateEvents() 时问题得到解决的原因。您可以通过调用 subview.setElement() 优雅地解决这个问题,它会为您调用 .delegateEvents()

在您的主视图中,只需替换:

$('#selection',this.el).append(this.task_selection_view.render().el);

与:

this.task_selection_view.setElement(this.$('#selection')).render();

这是上下文中的那一行(参见 render 函数):

TasksView = ****.Views.BaseView.extend({
    id: 'log-container',
    className: 'row-fluid',
    initialize: function () {
        this.task_selection_view = new TaskSelectionView();
    },
    remove: function () {
        this.task_selection_view.remove();
        Backbone.View.prototype.remove.call(this);
    },
    render: function () {
        $(this.el).html(Templates['log/log']);
        this.task_selection_view.setElement(this.$('#selection')).render();
        return this;
    }
});

进一步阅读