2

我是 Backbone 的新手,并试图做一些例子,但我坚持这个。我有以下主干视图:

CommentBoxView = Backbone.View.extend({
    initialize: function () {
        this.render();
    },
    render: function () {
        var template = _.template( $("#comment_box_template").html(), {} );
        this.el.html(template);
    },
    events: {
        "keypress textarea": "doKeyPress"
    },
    doKeyPress: function (event) {
        console.log(event);
    }
});

一切正常,但如果我更换

this.el.html(模板);

有了这个:

this.el = $(模板).replaceAll(this.el);

keypress 事件根本不会被触发。谁能向我解释它为什么会发生以及如何使这段代码起作用?非常感谢大家。

4

1 回答 1

6

Backbone 使用视图的delegateEvents方法将 jQuerydelegate调用绑定到视图的el,这delegate是处理所有视图事件的方法。如果你这样做:

this.el = $(template).replaceAll(this.el);

你失去了delegate约束this.el,你的事件随之而来。你也会以this.$el不匹配this.el而告终,这也不好。更改视图的正确方法el是使用setElement

设置元素 view.setElement(element)

如果您想将 Backbone 视图应用到不同的 DOM 元素,请使用setElement,它还将创建缓存$el引用并将视图的委托事件从旧元素移动到新元素。

所以你应该能够这样做:

this.setElement($(template).replaceAll(this.el));
于 2012-09-01T18:22:56.340 回答