Pourquoi les événements ne se déclenchent pas après la deuxième Render Backbone.js?

StackOverflow https://stackoverflow.com/questions/8307911

  •  25-10-2019
  •  | 
  •  

Question

Je crée une application dans Backbone.js qui a un parent et plusieurs vues de l'enfant. Les vues de l'enfant contiennent des liens qu'ils écoutent et exécutent une fonction.

Le parent stocke une liste de tous les points de vue des enfants. Dans la fonction de rendu, après avoir été fait le calcul de son propre html, il effectue les opérations suivantes:


$(this.el).html(html);
for (var i = 0; i < this.views.length; i++){
    $('.children', this.el).append(this.views[i].render().el);
}

Réponse: Le problème était que je créais le lien pendant le rendu. C'est à dire. le premier render (qui a été appelé à partir init) l'événement binded avec succès au lien. Cependant, étant donné que tous les appels suivants de rendre recréer tout l'élément, le nouveau lien ne pas le gestionnaire lié. Ceci a été résolu par l'intermédiaire d'une solution consistant à ajouter @ Tom Tu this.delegateEvents() à la rendre

Était-ce utile?

La solution

Vous utilisez probablement quelque part la fonction de remove jquery pour éliminer les sous-vues de la vue - il supprime automatiquement tous les événements liés à l'élément (this.el) - ensemble dans l'objet events. Vous pouvez utilisez la méthode de this.delegateEvents() dans le rendu des sous-vues après avoir rendu de modèle pour lier de nouveau les délégués d'événements définis dans l'objet events ou utiliser la méthode jquery detach au lieu de supprimer des éléments de DOM sans supprimer des liaisons d'événements ( lien ). La méthode de delegateEvents est très coûteux et je recommande donc la méthode de detach pour enlever les éléments que vous souhaitez réutiliser si vous êtes rendu de longues listes de subviews -. Hors de propos si elle est juste un couple de vues

Autre possibilité est que vous avez défini l'objet events mal -. Difficile de dire à partir de la quantité de code fourni, mais je parie que sur le premier

Autres conseils

Un défi vraiment commun. Pour les futurs trouveurs de cette question, voici un article sur rendering de la vue:

Vous devez juste vous assurer que delegateEvents est appelé à lier de nouveau les événements sur votre subviews tout .html temps () des pistes. Et depuis setElement de Backbone appelle delegateEvents déjà, une solution rapide pourrait ressembler à ceci ...

http://ianstormtaylor.com/rendering-views-in -backbonejs-isnt-toujours-simple, /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top