2012-03-29 16 views
0

私のモデルの2つの属性は、一度変更されると互いに更新されるはずです。 startDateおよびendDate。それらの値はmoment.jsライブラリのMomentオブジェクトです。Backbone.jsの循環参照でスタックオーバーフローを回避するにはどうすればよいですか?

同じ日付の2つのモーメントオブジェクトは同等ではないため、バックボーンが常に変更されているように見えるため、最大スタックを超えるループが発生します。

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

もう一つのアイデア:

あなたがバックボーンv0.9.2を使用していますか? options.silentをより集中的に使用しているようです。 Look here

あなたが記述している動作はv0.9.1のようになります。

+0

瞬間の整数値を比較することができ、I 。ありがとうございました。 – doctororange

+0

Backbone v0.9.2 _silentビヘイビア_が問題を解決していますか? – fguillen

+0

v0.9.2はループ動作を防止します。それが起こるにつれ、我々は完全な実装でいくつかカスタムイベントを実装しました(OPのコードは実証的なものです)ので、あなたのアドバイスは素晴らしいものでした。 – doctororange

0

つのアイデア:

  1. 正しくMomentオブジェクトを管理するために下線メソッド_.isEqualを上書きします。 Proxy patternを使用できます。

  2. custom eventsを使用すると、トリガーされるタイミングをより詳細に制御できます。

0

私はバックボーンでこれを行う方法がわからないんだけど、私はあなたの答えの両方を受け入れることができる場合は、

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

または

(+moment() === +moment) // true 
関連する問題