Backbone View事件在更改el属性时不触发

时间:2012-09-01 17:07:09

标签: javascript backbone.js

我是Backbone的新手并试图做一些例子,但我坚持这个。 我有以下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 = $(template).replaceAll(this.el);

按键事件根本没有被触发。 任何人都可以向我解释为什么它发生以及如何使这个代码有效?非常感谢你们。

1 个答案:

答案 0 :(得分:6)

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

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

你失去了delegatethis.el的约束,你的事件就随之发生了。您最终还会得到this.$el不匹配的this.el,这也不好。更改视图el的正确方法是使用setElement

  

setElement view.setElement(element)

     

如果您想将Backbone视图应用于其他DOM元素,请使用 setElement ,这也将创建缓存的$el引用并从旧视图移动视图的委派事件元素到新的。

所以你应该能够这样做:

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