web-dev-qa-db-fra.com

pourquoi bindAll dans les vues backbone.js?

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);

?

48
LDK

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.

36
pawlik

_.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.

93
Georgii Ivankin

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
  }
});
59
Johnny Oshika