Hvordan unngår jeg Stack Overflow med sirkelreferanser i Backbone.js du?

stemmer
0

To attributter i min modell er ment for å oppdatere hverandre når skiftet en gang. Den startDateog endDate. Deres verdier er Moment objekter, fra moment.js biblioteket.

To Moment gjenstander av identiske datoer er ikke det samme, og så dette fører til en løkke som overstiger den maksimale stabel, fordi de synes å ryggrad til å alltid har endret seg.

new moment('01/01/12') == new moment('01/01/12') // => false

Den { silent: true }muligheten synes ikke å hjelpe, tror jeg fordi det bare utsetter endringen hendelsen stedet for å undertrykke det tilsammen, men jeg er ikke sikker.

Her er koden som renner over:

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'))

Jeg kan sette en global flagg for å hindre tilbakeringing sløyfe som i denne varianten:

  updateStartDate: =>
    if !@changing
      @changing = true
      @set({ startDate: @cloneEndDate().subtract('days', @get('interval')) }, { silent: true } ) 
      @changing = false

  updateEndDate: =>
    if !@changing
      @changing = true
      @set({ endDate: @cloneStartDate().add('days', @get('interval')) }, { silent: true } ) 
      @changing = false

... men dette er åpenbart en hackety løsning. Finnes det en bedre mønster for meg å følge i denne bruken saken?

Takk skal du ha.

Publisert på 29/03/2012 klokken 04:28
kilden bruker
På andre språk...                            


3 svar

stemmer
0

To ideer:

  1. Skrive understrek metode _.isEqualfor å håndtere ordentlig dine Momentgjenstander. Du kan bruke Proxy mønster .

  2. Bruk egendefinerte hendelser for å ha mer kontroll at når de blir utløst.

Svarte 29/03/2012 kl. 06:21
kilden bruker

stemmer
1

En annen idé:

Bruker du Backbone v0.9.2 ? det ser ut som det gjør en mer intensiv bruk av options.silent. Se her .

Den options.silentoppførselen du beskriver ser mer ut som v0.9.1.

Svarte 29/03/2012 kl. 06:31
kilden bruker

stemmer
0

Jeg er ikke sikker på hvordan du gjør dette i ryggraden, men du kan sammenligne heltallsverdi av de øyeblikkene

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

eller

(+moment() === +moment) // true
Svarte 23/04/2012 kl. 23:01
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more