我在修复此错误时遇到大麻烦。
我在Backbone.js中有一个视图,我想用键盘事件绑定一些动作。
以下是我的观点:
window.PicturesView = Backbone.View.extend({
initialize : function() {
$(document).on('keydown', this.keyboard, this);
},
remove : function() {
$(document).off('keydown', this.keyboard, this);
},
render : function(eventName) {
// blah blah blah
},
next : function() {
// blah
},
prev : function() {
// blah
},
keyboard : function(e) {
console.log(e.keyCode);
if (e.keyCode == 37) {
this.prev();
return false;
}
if (e.keyCode == 39) {
this.next();
return false;
}
}
});
当我按下键盘时,出现此错误:
Uncaught TypeError: Object [object Object] has no method 'apply'
这是由jQuery触发的。
阅读本文后:Uncaught TypeError: Object [object Object] has no method 'apply'
我也尝试过:
$(document).on('keydown', function(e) {
this.keyboard(e);
}, this);
但它仍然给我同样的错误。
并且:
$(document).on('keydown', 'keyboard', this);
以events : { 'event' : 'action' }
风格
但它没有做任何事情。
我可能会在我的代码中的其他地方使用jQuery找到一些hack,但由于我不是事件处理和Backbone的专家,我想以很好的方式运行它。
我希望我很清楚,谢谢
答案 0 :(得分:1)
$(document).on('keydown', this.keyboard, this);
因为它是一个jQuery选择器,所以它适用于jQuery。因此我需要一个代理来链接上下文:
$(document).on('keydown',$.proxy(this.keyboard,this));
一切都很好,谢谢你的帮助。
答案 1 :(得分:-1)
Backbone的典型事件语法应该有效。摆脱初始化代码并尝试。
// code above unaltered
initialize : function() { }, // of course you can remove these two, it was just to clarify that they should be empty.
remove : function() { },
render : function(eventName) {
// blah blah blah
this.delegateEvents(); // just to have them re-bound if the view is removed
},
events: {
'keydown': 'keyboard'
}
// rest of the code unaltered