2012-03-29 71 views
0

我的模型中的兩個屬性應該在更改時互相更新一次。 startDateendDate。它們的值是來自moment.js庫的Moment對象。如何在Backbone.js中避免使用循環引用的堆棧溢出?

相同日期的兩個Moment對象是不等價的,所以這會導致超過最大堆棧的循環,因爲它們看起來像Backbone一直都是變化的。

new moment('01/01/12') == new moment('01/01/12') // => false

{ silent: true }選擇似乎不幫忙,我想是因爲它only defers the change event而不是壓制它產品總數,雖然我不知道。

下面是溢出代碼:

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.silentLook here

您所描述的options.silent行爲看起來更像v0.9.1。

+0

如果我能同時接受你的答案的整數值,我將。謝謝。 – doctororange 2012-04-02 02:47:22

+0

So Backbone v0.9.2 _silent behavior_正在解決您的問題? – fguillen 2012-04-02 08:18:01

+0

v0.9.2確實可以防止循環行爲。碰巧,我們還在全面實施中實施了一些自定義事件(OP中的代碼僅用於說明),所以您的建議全面良好。 – doctororange 2012-04-04 02:38:14

0

兩個想法:

  1. 覆蓋下劃線方法_.isEqual妥善管理您的Moment對象。您可以使用Proxy pattern

  2. 使用custom events有更多的控制,當他們被觸發。

0

我不知道如何在骨幹做到這一點,但你可以比較的時刻

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

(+moment() === +moment) // true