Backbone 0.9.0更新日志说:
A view’s events hash may now also contain direct function values as
well as the string names of existing view methods.
当我尝试以下操作时失败,说该事件的值未定义.
var BB = Backbone.View.extend({ 'initialize': function() { this.$el.html('<input type="button" value="Click me!" />'); jQuery('body').html(this.el); },'events': { 'click input[type="button"]': this.buttonClicked },'buttonClicked': function() { alert('button clicked!'); } }); window.b = new BB()
我误解了这个新功能吗?有人可以解释它的工作方式与我预期的不同吗?也许这只是我在定义时的’this’的JavaScript语法/值被塞住了.
我习惯做的方式仍然有效:
'events': { 'click input[type="button"]': 'buttonClicked' },
解决方法
当JavaScript解析器到达时:
'events': { 'click input[type="button"]': this.buttonClicked },
这可能是窗口,而不是您期望的BB实例. window对象没有buttonClicked属性(至少在你的情况下不是这样)所以你真的这么说:
'events': { 'click input[type="button"]': undefined },
而且你的错误.
如果您查看delegateEvents
的源代码,您将看到ChangeLog的含义:
delegateEvents: function(events) { // ... for (var key in events) { var method = events[key]; if (!_.isFunction(method)) method = this[events[key]]; // ... } },
_.isFunction
电话是你感兴趣的.这意味着你可以这样说:
events: { 'click input[type="button"]': function() { alert('pancakes!') },'click button': some_function_that_is_in_scope }