私のモデルの 2 つの属性は、一度変更すると、お互いに更新されるはずです。startDate
とendDate
. _ それらの値は、moment.jsライブラリの Moment オブジェクトです。
同じ日付の 2 つの Moment オブジェクトは同等ではありません。バックボーンには常に変更されているように見えるため、最大スタックを超えるループが発生します。
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
...しかし、これは明らかにハッケティ ソリューションです。このユースケースで従うべきより良いパターンはありますか?
ありがとうございました。