2011-09-09 8 views
25

Ho esaminato alcuni esempi di applicazione basata su backbone.js. Ho notato che in alcuni (come this example sotto) la funzione di sottolineatura _.bindAll() viene utilizzato:Backbone.js: _.bindAll() in initialize: perché viene utilizzato?

initialize: function (args) { 
     _.bindAll(this, 'changeTitle'); 
     this.model.bind('change:title', this.changeTitle); 
    }, 

mentre in altri (come il todo app sotto) non lo fanno:

initialize: function() { 
    this.model.bind('change', this.render, this); 
    this.model.bind('destroy', this.remove, this); 
}, 

qual è lo scopo di _.bindAll() in questo contesto, ed è necessario?

+0

usando '_.bindAll' è una cattiva pratica perché se si elimina metodo e dimentica di modificare il' _.bindAll' tutto andrà in crash, anche alcune volte si ha bisogno ambito diverso da rilegata –

+0

Ma in dorsale 0.3.x non è possibile impostare il contesto nel bind evento in modo da utilizzare '_.bindAll' era popolare –

+0

@ant_Ti" era popolare "stai dicendo che con> 0.3.x non abbiamo più bisogno di fare questo? È così che mi sembra, quindi semplicemente assicurandoti. Grazie! – AdrianoFerrari

risposta

26

_.bindAll() modifiche this nelle funzioni denominate per puntare sempre a tale oggetto, in modo da poter utilizzare this.model.bind(). Si noti che nel secondo esempio, un terzo argomento viene passato a bind(); ecco perché l'uso di _.bindAll() non è necessario in questo caso. In generale, è una buona idea usare per qualsiasi metodo sul modello che sarà usato come callback per gli eventi in modo da poter fare riferimento a this più facilmente.

3
In Detail: _.bind(ctx, 'method') 

Prende il metodo, crea una copia con il contesto associato a 'ctx' e aggiunge la copia come proprietà.

Questa è una soluzione alternativa per jQuery.bind() che non consente di passare in un contesto. JQ chiamerà sempre i callback con un contesto non definito. Backbone è costruito su jQuery.

vedere qui: http://backbonejs.org/#FAQ-this

Problemi correlati