2011-12-15 1 views

risposta

5

Questo non è possibile perché Backbone utilizza gli eventi di hash per sottoscrivere gli eventi sul elemento della vista (proprietà view.el) e l'elemento di discendenti. Non si abbona agli eventi da elementi esterni all'elemento della vista.

Quindi se l'elemento della vista è tabella, la funzione doSomething() verrà chiamata quando l'evento keydown viene generato sulla tabella, ma non verrà chiamato se l'evento keydown viene attivato su un altro elemento della pagina.

+0

ne dite di vista che ha il 'el = $ ("corpo")'? Non che mi piacerebbe più - solo per il gusto di farlo/la curiosità. –

+1

@PLJ se el è $ ("body"), allora dovrebbe funzionare. Non conosco molte viste Backbone che hanno il corpo come elemento. – Paul

2

generale keydown su 'html' dovrebbe funzionare, vedi questa domanda:

keydown on body?

Tuttavia, è generalmente meglio avere gli eventi in un backbone Guarda vengono attivati ​​da elementi nella vista el. In questo caso si potrebbe rendere il vostro generale a livello di app View accetta ingressi KeyDown:

events: { 
    'keydown': 'doSomething' 
} 
1

Basta associarlo utilizzando un framework come jQuery all'interno del metodo di inizializzazione della vista.

var View = Backbone.View.extend({ 
     initialize: function() { 
     _.bindAll(this, "keyPress"); 
     $(document).bind('keydown', this.keyPress); 
     }, 
     keyPress: function(e) { 
     console.log(e.keyCode); 
     alert(e.keyCode); 
     return false; 
     } 
    }); 

Non dimenticare di sciogliere, è importante; è possibile controllare in keyPress per vedere se la vista è ancora nel DOM (Document) utilizzando $(document).find(this.$el).size()

if($(document).find($(this.options.container)).size() <= 0) { 
     alert("view not in document"); 
     $(document).unbind('keydown', this.keyPress); 
}else { 
     alert("view is here"); 
}