2011-09-09 5 views
25

He estado viendo algunos ejemplos de la aplicación basada en backbone.js. Me he dado cuenta de que se utiliza en algunos (como this example abajo) la función de subrayado _.bindAll():Backbone.js: _.bindAll() in initialize - why is this used?

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

mientras que en otros (como el todo app a continuación) no hacer:

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

Cuál es el propósito de _.bindAll() en este contexto, ¿es necesario?

+0

usando '_.bindAll' es una mala práctica, porque si elimina método y se olvide de editar su' _.bindAll' todo se bloqueará, también algunas veces se necesitan ámbito diferente de binded –

+0

Pero en la red troncal 0.3.x no se puede establecer el contexto en el enlace de eventos, por lo que usar '_.bindAll' era popular –

+0

@ant_Ti" era popular "¿Dices que con> 0.3.x ya no necesitamos hacer esto? Así es como me parece, así que solo estoy seguro. ¡Gracias! – AdrianoFerrari

Respuesta

26

_.bindAll() cambia this en las funciones nombradas para que siempre apunte a ese objeto, para que pueda usar this.model.bind(). Observe que en su segundo ejemplo, se pasa un tercer argumento al bind(); es por eso que usar _.bindAll() no es necesario en ese caso. En general, es una buena idea usar cualquier método del modelo que se utilizará como devolución de llamada a eventos para que pueda consultar el this más fácilmente.

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

Toma su método, crea una copia con el contexto vinculado a 'ctx' y agrega la copia como propiedad.

Esto es una solución para jQuery.bind() que no le permite pasar en un contexto. JQ siempre llamará a las devoluciones de llamada con un contexto indefinido. Backbone está basado en jQuery.

Ver aquí: http://backbonejs.org/#FAQ-this

Cuestiones relacionadas