我怎么延迟在backbone.js中绑定一个事件,直到一段时间后?

时间:2013-02-11 00:09:16

标签: javascript events backbone.js backbone-events

app.myView = Backbone.View.extend({
   events: {
   'mouseenter .myitem': 'myfunction'
   }    
});

如何将此事件从创建延迟到某个时间或直到我决定要创建它为止。现在它是在我的视图加载后立即创建的,只要我输入就会触发mouseevent .myitem

2 个答案:

答案 0 :(得分:2)

您可以随时手动创建它(使用events对象只是一个快捷方式):

// call this somewhere once you're ready to attach the callback method    
this.$el.on(eventName, _.bind(method, this));

或者用你的例子:

this.$el.on('mouseenter .myitem', _.bind(this.myfunction, this));

答案 1 :(得分:2)

Backbone使用delegateEvents绑定视图事件:

  

delegateEvents delegateEvents([events])

     

使用jQuery的on函数为视图中的DOM事件提供声明性回调。如果未直接传递事件哈希,请使用this.events作为来源   [...]
  当再次运行 delegateEvents 时,可能使用不同的events哈希值,所有回调都将被删除并重新委派 - 对于在不同模式下需要表现不同的视图非常有用。

每当您想要更改事件绑定时,都可以调用delegateEvents。因此,一种方法是调整this.events并调用this.delegateEvents()

add_event: function() {
    this.events = _({}).extend(this.events, {
        'mouseenter .myitem': 'myfunction'
    });
    this.delegateEvents();
}

extend电话是一个好主意,因为Backbone.View.extend会让events附加视图的原型,只需更改this.events

this.events['mouseenter .myitem'] = 'myfunction';

会改变视图的所有实例的events。这样做的好处是,调用undelegateEvents将执行正确的事情,所有视图事件将以相同的方式处理。

演示:http://jsfiddle.net/ambiguous/Bd4SB/