2011-05-21 14 views
48

En la red troncal todo demo, el código tiene algunos puntos donde se usa _.bindAll(this,...). Específicamente se usa en la función initialize de ambas vistas. Por lo que yo puedo decir que es necesario hacer lo siguiente:¿por qué bindAll en las vistas de backbone.js?

this.$('.todo-content').text(content); 

Pero ¿por qué uno quiere hacer lo anterior, cuando se puede hacer:

$('.todo-content').text(content); 

?

Respuesta

36

this.$ limita el contexto de jQuery al elemento de la vista, por lo que las operaciones son más rápidas.

Additionaly, this.$('.todo-item') no encontrará sus elementos con la clase todo-item fuera del elemento de su vista.

93

_.bindAll(this, ...) es necesario no solo para this.$(selector).doSomething() en general, para estar seguro de que this en el método de su vista siempre apunta a la vista en sí.

Por ejemplo, si queremos refrescar nuestro punto de vista, cuando los cambios de modelo, que unen el método de la vista render a change caso del modelo:

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

Sin _.bindAll(this, 'render'), cuando el modelo cambia this en render será apuntando al modelo , no a la vista, por lo que no tendremos this.el ni this.$ ni ninguna otra propiedad de vista disponible.

59

A partir de Backbone 0.5.2, ya no es necesario utilizar _.bindAll (this ...) en sus vistas para establecer el contexto de las funciones de devolución de llamada "bind", ya que ahora puede pasar un tercer argumento a bind() que establecerá el contexto (es decir, "esto") de la devolución de llamada.

Por ejemplo:

var MyView = Backbone.View.extend({ 
    initialize: function(){ 
    this.model.bind('change', this.render, this); 
    }, 
    render: function(){ 
    // "this" is correctly set to the instance of MyView 
    } 
}); 
+15

La línea "this.model.bind ('cambio', this.render, este)" sólo lo hace girar mi cabeza>< –

+3

Try CoffeeScript y su operador =>.. – dira

+7

Observe que 'this.bind' (o' this.model.bind') hace algo completamente diferente a '_.bind'. Me tomó un tiempo darme cuenta. –

Cuestiones relacionadas