Ich arbeite mit der Todos Beispielanwendung bundled with the latest version of Backbone (0.9.2) beim Lernen über Backbone.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?Backbone.js feuert Render zweimal auf Sammlung hinzufügen
Wenn Ich stelle diese Linie in der Funktion des TodoView machen: "Rendering"
// Re-render the titles of the todo item.
render: function() {
console.log("Rendering!");
this.$el.html(this.template(this.model.toJSON()));
Dann erscheint zweimal in der Konsole. Ich verstehe dies, weil die Ansicht des Änderungsereignis Modell bindet die Ansicht des Render:
initialize: function() {
this.model.bind('change', this.render, this);
Und macht in ADDone genannt wird, die zu den Todos' add Ereignis gebunden ist:
addOne: function(todo) {
var view = new TodoView({model: todo});
this.$("#todo-list").append(view.render().el);
},
Aber sind diese doppelte Rendering-Design-Standard-Praxis? 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.
Noch einmal, ich lerne gerade Backbone, also kann ich ein grundlegendes Missverständnis haben, das zu meiner Verwirrung führt.
netter Fang! .. Sie können auch '{silent: true}' verwenden, um das Auslösen von Ereignissen zu vermeiden. – fguillen
Sie haben Recht, deshalb wird das Änderungsereignis ausgelöst. Wenn Sie jedoch den Code in der von Ihnen vorgeschlagenen Weise ändern, wird das Ereignis gestoppt, aber auch die Funktionalität (ich kann Elemente nicht mehr löschen). Offensichtlich ist das für die Beantwortung meiner Frage nicht wichtig, aber nur für den Fall, dass dies jemand in der Zukunft liest, wollte ich darauf hinweisen. – jcady
Elemente löschen _permanently_ das ist. Nach dem Löschen, wenn ich sie aktualisiere, existieren sie noch. – jcady