2012-03-29 3 views
0

Два атрибута в моей модели должны обновлять друг друга при изменении один раз. startDate и endDate. Их значения - объекты Moment, из библиотеки moment.js.Как избежать переполнения стека с помощью циклических ссылок в Backbone.js?

Два моментальных тождества идентичных дат не эквивалентны, и поэтому это приводит к тому, что цикл превышает максимальный стек, потому что они кажутся Backbone, чтобы они всегда менялись.

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

Опция { silent: true }, кажется, не поможет, я думаю, потому что only defers the change event, а не подавлять его ALLtogether, хотя я не уверен.

Вот код, который переполняется:

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

Я могу установить глобальный флаг, чтобы предотвратить цикл обратного вызова, как в этом варианте:

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 

... но это очевидно, решение хакети. Есть ли лучший образец для меня в этом прецеденте?

спасибо.

ответ

1

Еще одна идея:

Вы используете Backbone v0.9.2? похоже, что он более интенсивно использует options.silent. Look here.

Описание поведения, которое вы описываете, больше похоже на v0.9.1.

+0

Если бы я мог принять оба ваших ответов, я бы. Спасибо. – doctororange

+0

So Backbone v0.9.2 _silent behavior_ исправляет вашу проблему? – fguillen

+0

v0.9.2 предотвращает поведение цикла. Как это происходит, мы также внедрили некоторые пользовательские события в полной реализации (код в OP только демонстрационный), поэтому ваши советы были отличными во всем. – doctororange

0

Две идеи:

  1. Переписать метод Underscore _.isEqual управлять должным образом свои Moment объекты. Вы можете использовать Proxy pattern.

  2. Используйте custom events, чтобы иметь больше контроля, когда они срабатывают.

0

Я не знаю, как сделать это в позвоночнике, но вы можете сравнить целое значение моментов

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

или

(+moment() === +moment) // true