Dans le backbone todo demo le code a quelques endroits où _.bindAll(this,...)
est utilisé. Plus précisément, il est utilisé dans la fonction initialize
des deux vues. Pour autant que je sache, il est nécessaire de procéder comme suit:
this.$('.todo-content').text(content);
Mais pourquoi voudrait-on faire ce qui précède, quand on peut faire:
$('.todo-content').text(content);
?
this.$
Limite le contexte de jQuery à l'élément de la vue, donc les opérations sont plus rapides.
De plus, this.$('.todo-item')
ne trouvera pas vos éléments avec la classe todo-item
En dehors de l'élément de votre vue.
_.bindAll( this, ... )
est nécessaire non seulement pour this.$( selector ).doSomething()
mais généralement pour être sûr que this
dans la méthode de votre vue pointe toujours vers la vue elle-même.
Par exemple, si nous voulons actualiser notre vue lorsque le modèle change, nous lions la méthode render
de la vue à l'événement change
du modèle:
initialize: function() {
this.model.bind( 'change', this.render );
},
Sans _.bindAll( this, 'render' )
, lorsque le modèle change this
dans render
pointera vers le modèle, pas vers la vue, donc nous ne le ferons pas n'ont ni this.el
ni this.$
ni aucune autre propriété de vue disponible.
Depuis Backbone 0.5.2, il n'est plus nécessaire d'utiliser _.bindAll (this ...) dans vos vues pour définir le contexte des fonctions de rappel "bind", car vous pouvez maintenant passer un 3e argument à bind () qui définira le contexte (c'est-à-dire "ceci") du rappel.
Par exemple:
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
}
});