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

War es hilfreich?

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/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top