Backbone.js wird beim Hinzufügen von Sammlungen zweimal gerendert

8

Ich arbeite mit der Todos-Beispielanwendung , die mit der neuesten Version von Backbone ausgeliefert wird (0.9.2), während ich über Backbone lerne .js. Meine Frage ist, warum ist die App so konzipiert, dass das Render-Ereignis zweimal ausgelöst wird, wenn ein Modell zur Todos-Sammlung hinzugefügt wird?

Wenn ich diese Zeile in die Renderfunktion des TodoViews lege:

%Vor%

Dann "Rendern!" erscheint zweimal in der Konsole. Ich verstehe, dass dies daran liegt, dass die Ansicht das Änderungsereignis des Modells mit dem Render der Ansicht verknüpft:

%Vor%

Und rendern wird in addOne aufgerufen, das an das add-Ereignis von Todos gebunden ist:

%Vor%

Aber ist das doppelte Rendering-Design Standard? Es scheint, als ob die Ansicht bei der Erstellung (oder dem Eintritt in das DOM) gerendert werden sollte, und dann wieder, wenn sich das zugrunde liegende Modell ändert. In diesem Fall wird nichts geändert, aber Render wird zweimal aufgerufen.

Ich lerne gerade Backbone, also habe ich vielleicht ein grundlegendes Missverständnis, das zu meiner Verwirrung führt.

    
jcady 19.04.2012, 12:38
quelle

2 Antworten

5

Hm, hatte einen schnellen Blick. Sie haben Recht, dass dies geschieht, und nein, es ist nicht Standardpraxis. Der Grund ist ein wenig unklar, also ertragen Sie mich;)

Die Todo-App verwendet Backbone-Localstorage. Wenn Sie versuchen, ein neues Element in der App hinzuzufügen, ruft es auf:

%Vor%

Beachten Sie die Todos.create . Normalerweise fügt ein create der Sammlung ein Modell hinzu und speichert es auf dem Server. Das add -Ereignis wird somit ausgelöst. Es geschieht jedoch, dass Backbone-Localstorage am create folgendes tut:

%Vor%

Beachten Sie model.set , um dem Modell eine ID zu geben. Dies löst das (zweite) Ereignis change aus.

Sie können dies verhindern, indem Sie create to do ändern:

if (!model.id) model.id = guid();

    
ggozad 19.04.2012, 15:45
quelle
1
___ tag123javascript ___ JavaScript (nicht zu verwechseln mit Java) ist eine dynamische Sprache mit mehreren Paradigmen auf hoher Ebene, die sowohl für das clientseitige als auch für das serverseitige Scripting verwendet wird. Verwenden Sie dieses Tag für Fragen zu ECMAScript und seinen verschiedenen Dialekten / Implementierungen (außer ActionScript und Google-Apps-Script). ___ tag123backbonejs ___ Backbone.js ist ein JavaScript-Framework mit einer REST-fähigen JSON-Schnittstelle und basiert auf dem MVP-Design (Model-View-Presenter) ___ qstnhdr ___ Backbone.js wird beim Hinzufügen von Sammlungen zweimal gerendert ___ answer10231789 ___

Hm, hatte einen schnellen Blick. Sie haben Recht, dass dies geschieht, und nein, es ist nicht Standardpraxis. Der Grund ist ein wenig unklar, also ertragen Sie mich;)

Die Todo-App verwendet Backbone-Localstorage. Wenn Sie versuchen, ein neues Element in der App hinzuzufügen, ruft es auf:

%Vor%

Beachten Sie die render() . Normalerweise fügt ein %code% der Sammlung ein Modell hinzu und speichert es auf dem Server. Das %code% -Ereignis wird somit ausgelöst. Es geschieht jedoch, dass Backbone-Localstorage am %code% folgendes tut:

%Vor%

Beachten Sie %code% , um dem Modell eine ID zu geben. Dies löst das (zweite) Ereignis %code% aus.

Sie können dies verhindern, indem Sie create to do ändern:

%code%

    
___ antwort10231119 ___

Das Rendern sollte nicht passieren.

Versuchen Sie debuggen ein wenig mehr. Versuchen Sie, das Ereignis change an eine -Wrappermethode wie:

zu binden %Vor%

Um sicher zu gehen, dass die zweite %code% für die Änderungsereignisbindung gemacht wurde und nicht aus anderen Gründen.

    
___ qstntxt ___

Ich arbeite mit der Todos-Beispielanwendung , die mit der neuesten Version von Backbone ausgeliefert wird (0.9.2), während ich über Backbone lerne .js. Meine Frage ist, warum ist die App so konzipiert, dass das Render-Ereignis zweimal ausgelöst wird, wenn ein Modell zur Todos-Sammlung hinzugefügt wird?

Wenn ich diese Zeile in die Renderfunktion des TodoViews lege:

%Vor%

Dann "Rendern!" erscheint zweimal in der Konsole. Ich verstehe, dass dies daran liegt, dass die Ansicht das Änderungsereignis des Modells mit dem Render der Ansicht verknüpft:

%Vor%

Und rendern wird in addOne aufgerufen, das an das add-Ereignis von Todos gebunden ist:

%Vor%

Aber ist das doppelte Rendering-Design Standard? Es scheint, als ob die Ansicht bei der Erstellung (oder dem Eintritt in das DOM) gerendert werden sollte, und dann wieder, wenn sich das zugrunde liegende Modell ändert. In diesem Fall wird nichts geändert, aber Render wird zweimal aufgerufen.

Ich lerne gerade Backbone, also habe ich vielleicht ein grundlegendes Missverständnis, das zu meiner Verwirrung führt.

    
___
fguillen 19.04.2012 15:09
quelle

Tags und Links