骨干绑定事件keydown到文档返回Uncaught TypeError:Object [object Object]没有方法'apply'

时间:2012-10-30 16:57:40

标签: jquery backbone.js keyboard-events keydown

我在修复此错误时遇到大麻烦。

我在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的专家,我想以很好的方式运行它。

我希望我很清楚,谢谢

2 个答案:

答案 0 :(得分:1)

@ roatin-marth是对的。正在应用的“on”函数不是我预期的主干函数,它允许将上下文作为参数传递: $(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