2012-03-29 8 views
0

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.

Antwort

1

Eine weitere Idee:

Sind Sie mit Backbone v0.9.2? es sieht so aus, als ob es die options.silent intensiver nutzt. Look here. Das options.silent Verhalten, das Sie beschreiben, sieht eher wie v0.9.1 aus.

+0

vergleichen Wenn ich Ihre beiden Antworten akzeptieren konnte ich würde. Vielen Dank. – doctororange

+0

Also Backbone v0.9.2 _silent behavior_ behebt Ihr Problem? – fguillen

+0

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

0

Zwei Ideen:

  1. die Methode Unders _.isEqual richtig Ihre Moment Objekte zu verwalten überschreiben. Sie können das Proxy pattern verwenden.

  2. Verwenden Sie custom events, um mehr Kontrolle zu haben, wenn sie ausgelöst werden.

0

Ich bin nicht sicher, wie dies in Rückgrat zu tun, aber man kann den ganzzahligen Wert der Momente

(moment().valueOf() === moment().valueOf()) // true 

oder

(+moment() === +moment) // true 
Verwandte Themen