Два атрибута в моей модели должны обновлять друг друга при изменении, один раз. startDate
и endDate
. Их значения - это объекты Moment из библиотеки moment.js .
Два объекта Moment с одинаковыми датами не эквивалентны, и поэтому возникает цикл, который превышает максимальный стек, поскольку кажется, что Backbone всегда менялся.
new moment('01/01/12') == new moment('01/01/12') // => false
Опция { silent: true }
, кажется, не помогает, я думаю, потому что только задерживает событие изменения , а не подавляет его полностью, хотя я не уверен.
Вот код, который переполняет:
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 !@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
... но это, очевидно, хакерское решение. Есть ли лучший пример для меня, чтобы следовать в этом случае использования?
Спасибо.