Два атрибута в моей модели должны обновлять друг друга при изменении один раз. 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
... но это очевидно, решение хакети. Есть ли лучший образец для меня в этом прецеденте?
спасибо.
Если бы я мог принять оба ваших ответов, я бы. Спасибо. – doctororange
So Backbone v0.9.2 _silent behavior_ исправляет вашу проблему? – fguillen
v0.9.2 предотвращает поведение цикла. Как это происходит, мы также внедрили некоторые пользовательские события в полной реализации (код в OP только демонстрационный), поэтому ваши советы были отличными во всем. – doctororange