0

私のモデルの 2 つの属性は、一度変更すると、お互いに更新されるはずです。startDateendDate. _ それらの値は、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

...しかし、これは明らかにハッケティ ソリューションです。このユースケースで従うべきより良いパターンはありますか?

ありがとうございました。

4

3 に答える 3

1

別のアイデア:

Backbone v0.9.2を使用していますか?をより集中的に使用しているようoptions.silentです。ここを見てください

options.silentあなたが説明している振る舞いはv0.9.1のように見えます。

于 2012-03-29T08:31:35.833 に答える
0

2 つのアイデア:

  1. Underscore メソッド_.isEqualを上書きして、オブジェクトを適切に管理しますMomentProxy パターンを使用できます。

  2. カスタム イベントを使用して、いつトリガーされるかをより詳細に制御します。

于 2012-03-29T08:21:02.053 に答える
0

バックボーンでこれを行う方法はわかりませんが、モーメントの整数値を比較できます

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

また

(+moment() === +moment) // true
于 2012-04-24T01:01:00.293 に答える