Backbone.js事件绑定

Chr*_*ris 17 jquery events binding callback backbone.js

我正在使用Backbone.js为每个模型的视图都有一个分段控件类型的UI元素.它们各自由具有少量li元素的ul组成.我想绑定一个事件,以便在单击其中一个元素时,我可以确定单击了哪个元素并使用适当的值更新模型.

问题是Backbone绑定事件(这些事件在视图的事件哈希中),使得回调函数中的"this"引用视图,而不是li元素.这意味着我无法确定单击了哪些li元素.如果我使用普通的jQuery绑定,我可以将"this"绑定到li元素,但是我不再跟踪模型了,所以我无法更新它.

jas*_*nas 44

jQuery习惯于设置this当时很方便的东西是一种非常讨厌的模式,在我看来 - 幸运的是,你永远不必依赖它:

onClick: function(e) {
  this;                // Still the view instance (as it should be).
  e.target;            // The element that was clicked.
  e.currentTarget;     // The element that was bound by the click event.
}
Run Code Online (Sandbox Code Playgroud)

...您可以根据需要使用事件对象targetcurrentTarget.

  • @JensAlm那是对的.Backbone的.trigger()函数触发Backbone模型上的事件,而Backbone视图的'event'列表连接到jQuery的delegateEvents.它们是两种不同的事件系统. (2认同)

Mat*_*eon 20

想不通为什么我不能评论@jashkenas上面的回答.他的方法是正确的(谢谢!)但我想我会澄清这种情况:在你的事件处理程序中,你可以恢复事件绑定的元素.示例骨干代码如下所示:

MyView = Backbone.View.extend({
    events: {
        'click .item': 'handleClick'
    },

    handleClick: function(e) {
        this; // The view instance
        e.target; // The element that was clicked 
        e.currentTarget; // The element that was bound by the click event
    }
});
Run Code Online (Sandbox Code Playgroud)

我用它在我的所有表单字段中设置默认文本...是的我还没有进入HTML5 :)

编辑: 顺便说一下,e.target是原始元素.您需要使用$(e.target)来获取jQuery访问权限.