Warum schießen Ereignisse nach dem zweiten Render in Backbone.js nicht?
-
25-10-2019 - |
Frage
Ich erstelle eine App in Backbone.js mit über Eltern und mehreren untergeordneten Ansichten. Die untergeordneten Ansichten enthalten Links, die sie anhören und eine Funktion ausführen.
Die Eltern speichern eine Liste aller Kinderansichten. In der Renderfunktion wird nach dem Berechnen seiner eigenen HTML die folgenden:
$(this.el).html(html);
for (var i = 0; i < this.views.length; i++){
$('.children', this.el).append(this.views[i].render().el);
}
Antwort: Das Problem war, dass ich den Link während des Renders erstellt habe. IE beim ersten Render (das aus dem Init genannt wurde) das Ereignis erfolgreich für den Link gebeten. Da jedoch alle folgenden Rendern das gesamte Element wiederherstellen, hatte der neue Link nicht den Handler daran gebunden. Dies wurde über @tom Tu -Lösung des Hinzufügens gelöst this.delegateEvents()
zum Render
Lösung
Sie verwenden wahrscheinlich JQuery remove
Funktion irgendwo, um die Unteransicht aus der Ansicht zu entfernen - sie entfernt automatisch alle an das Element (this.el) gebundenen Ereignisse - in der festgelegt events
Objekt. Sie können entweder verwenden this.delegateEvents()
Methode im Rendern der Unteransichten nach dem Rendern der Vorlage, um die in ein festgelegten Ereignisdelegierten wiederherzustellen events
Objekt oder JQuery verwenden detach
Methode stattdessen, um Elemente aus DOM zu entfernen, ohne Ereignisbindungen zu entfernen (Verknüpfung). Das delegateEvents
Methode ist ziemlich kostspielig und ich würde das empfehlen detach
Methode zum Entfernen von Elementen, die Sie wiederverwenden möchten, wenn Sie lange Listen von Unteransichten machen - irrelevant, wenn es sich nur um ein paar Ansichten handelt.
Andere Möglichkeiten sind, dass Sie die festgelegt haben events
Objekt falsch - schwer aus der Menge des bereitgestellten Codes zu erkennen, aber ich wette auf die erste.
Andere Tipps
Eine wirklich häufige Herausforderung. Für zukünftige Finder dieser Frage finden Sie einen großartigen Artikel über das Rendern der Sichtweise:
Sie müssen nur sicherstellen, dass Delegate -Events aufgerufen werden, um die Ereignisse auf Ihren Unteransichten jederzeit zu wiederholen .html () läuft. Und da die Setelement -Aufrufe von Backbone bereits Delegate -Events aufruft, könnte eine schnelle Lösung so aussehen ...
http://ianstormtaylor.com/renderering-view-in-backbonejs-isnt-alway-simple/