Zwei Attribute in meinem Modell sollen sich bei Änderung einmal gegenseitig aktualisieren. Die startDate
und endDate
. Ihre Werte sind Moment-Objekte aus der Bibliothek moment.js.Wie vermeide ich Stack Overflow mit kreisförmigen Referenzen in Backbone.js?
Zwei Moment-Objekte mit identischen Daten sind nicht äquivalent und daher verursacht dies eine Schleife, die den maximalen Stapel überschreitet, da sie für Backbone immer geändert werden.
new moment('01/01/12') == new moment('01/01/12') // => false
Die { silent: true }
Option scheint zu helfen nicht, ich glaube, weil es only defers the change event anstatt es alltogether unterdrücken, obwohl ich nicht sicher bin.
Hier ist der Code, der überläuft:
class Paydirt.Models.BlockBrowser extends Backbone.Model
initialize: =>
@on('change:startDate', @updateEndDate)
@on('change:endDate', @updateStartDate)
updateStartDate: =>
@set({ startDate: @cloneEndDate().subtract('days', @get('interval')) }, { silent: true }
updateEndDate: =>
@set({ endDate: @cloneStartDate().add('days', @get('interval')) }, { silent: true })
cloneStartDate: => new moment(@get('startDate'))
cloneEndDate: => new moment(@get('endDate'))
ich eine globale Flag gesetzt kann die Callback-Schleife, wie in dieser Variante zu verhindern:
updateStartDate: =>
if [email protected]
@changing = true
@set({ startDate: @cloneEndDate().subtract('days', @get('interval')) }, { silent: true })
@changing = false
updateEndDate: =>
if [email protected]
@changing = true
@set({ endDate: @cloneStartDate().add('days', @get('interval')) }, { silent: true })
@changing = false
... aber das ist offensichtlich eine hackige Lösung. Gibt es ein besseres Muster für mich in diesem Anwendungsfall zu folgen?
Vielen Dank.
vergleichen Wenn ich Ihre beiden Antworten akzeptieren konnte ich würde. Vielen Dank. – doctororange
Also Backbone v0.9.2 _silent behavior_ behebt Ihr Problem? – fguillen
v0.9.2 verhindert das Schleifenverhalten. Wie dem auch sei, wir haben auch einige benutzerdefinierte Ereignisse in der vollständigen Implementierung implementiert (der Code im OP ist nur demonstrativ), so dass Ihr Ratschlag rundherum hervorragend war. – doctororange