48 votes

Pourquoi utiliser bindAll dans les vues backbone.js ?

Dans la démonstration de tâches de Backbone, le code comporte quelques endroits où _.bindAll(this,...) est utilisé. Il est notamment utilisé dans la fonction initialize des deux vues. Autant que je sache, il est nécessaire de faire ce qui suit :

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

Mais pourquoi voudrait-on faire cela, alors qu'on peut faire :

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

?

93voto

Georgiy Ivankin Points 1661

_.bindAll( this, ... ) est nécessaire non seulement pour this.$( selector ).doSomething() mais également pour s'assurer que this dans la méthode de vue pointe toujours vers la vue elle-même.

Par exemple, si nous voulons rafraîchir 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 n'aurons ni this.el ni this.$ ni aucune autre propriété de la vue disponible.

59voto

Johnny Oshika Points 15580

À partir de 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 désormais passer un 3ème argument à bind() qui définira le contexte (c'est-à-dire "this") du rappel.

Par exemple:

var MyView = Backbone.View.extend({
  initialize: function(){
    this.model.bind('change', this.render, this);
  },
  render: function(){
    // "this" est correctement défini sur l'instance de MyView
  }
});

36voto

pawlik Points 2128

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X