2012-02-02 7 views
7

la spina dorsale 0.9.0 changelog dice:In che modo il nuovo hash "eventi" di Backbone View funziona con valori di funzione anziché stringhe nella versione 0.9.0?

eventi di una vista hash possono ora contenere anche valori di funzione diretti come così come i nomi di stringa di metodi vista esistente.

Quando provo quanto segue non funziona, dicendo che il valore per l'evento è undefined.

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() 

Sto fraintendendo la nuova funzione? Qualcuno può spiegare come funziona in modo diverso da quanto mi aspettassi? Forse è solo la mia sintassi JavaScript/valore di "questo" al momento della definizione che è borked.

Il modo in cui mi sono abituato a farlo ancora funziona:

'events': { 
    'click input[type="button"]': 'buttonClicked' 
}, 

risposta

14

Quando il parser JavaScript arriva qui:

'events': { 
    'click input[type="button"]': this.buttonClicked 
}, 

this è probabilmente window, non un esempio di come ci si aspetta BB . L'oggetto window non ha una proprietà buttonClicked (almeno non è così nel tuo caso) in modo che stai davvero dicendo questo:

'events': { 
    'click input[type="button"]': undefined 
}, 

e c'è il vostro errore.

Se si guarda alla fonte per delegateEvents, vedrete che cosa significa il ChangeLog:.

delegateEvents: function(events) { 
    // ... 
    for (var key in events) { 
    var method = events[key]; 
    if (!_.isFunction(method)) method = this[events[key]]; 
    // ... 
    } 
}, 

Questo _.isFunction chiamata è ciò che ti interessa Ciò significa che si può dire cose come questa:

events: { 
    'click input[type="button"]': function() { alert('pancakes!') }, 
    'click button': some_function_that_is_in_scope 
} 

funzioni modo da poter mettere definiti (sia con il loro nome se sono letterali di funzione accessibili o come) nella tabella events ricerca.

+1

Molto bene, grazie. L'unica cosa che mi chiedo a questo punto è se ciascuna funzione anonima che ho definito (come ad esempio il "pancake!" Nel tuo esempio) avrà il suo valore di "this" per la vista, o se sarà qualunque sia l'obiettivo di l'evento è Mi sembra che questa linea assicurerebbe che sia applicata alla View stessa: method = _.bind (method, this); –

+2

@awcrud: la riga 1078 (e questo esempio: http://jsfiddle.net/ambiguous/JEavM/1/) indica che la funzione anonima sarà limitata alla vista. –

Problemi correlati