2012-10-30 64 views
0

我在解決這個錯誤時遇到了很大的麻煩。Backbone將事件keydown綁定到文檔返回Uncaught TypeError:Object [object Object] has no method'apply'

我在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來發現一些黑客行爲,但由於我不擅長事件處理和Backbone,所以我希望能夠很好地運行它。

我希望我很清楚,謝謝

+1

[這不是'on']的正確用法(http://api.jquery.com/on/)。 –

回答

1

@ roatin-marth是正確的。正在使用的「開」功能並不是我期望的主幹功能,它允許將上下文作爲參數傳遞: $(document).on('keydown', this.keyboard, this);

由於它是jQuery選擇器,它就是適用的jQuery。因此,我需要一個代理鏈接上下文: $(document).on('keydown',$.proxy(this.keyboard,this));

一切都很好,謝謝你的幫助。

-1

Backbone的典型事件語法應該可以工作。擺脫初始化代碼並嘗試。

​​
+0

謝謝,但這沒有奏效。顯然,按鍵監聽器只適用於文檔而不適用於子代碼。或者這是一個我不想處理的焦點問題,因爲我希望聽衆能夠在文檔中的任何位置應用。我會寫下答案。 –

相關問題