我的模型中的兩個屬性應該在更改時互相更新一次。 startDate
和endDate
。它們的值是來自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
...但是這是顯然是一個糟糕的解決方案。在這個用例中有沒有更好的模式?
謝謝。
如果我能同時接受你的答案的整數值,我將。謝謝。 – doctororange 2012-04-02 02:47:22
So Backbone v0.9.2 _silent behavior_正在解決您的問題? – fguillen 2012-04-02 08:18:01
v0.9.2確實可以防止循環行爲。碰巧,我們還在全面實施中實施了一些自定義事件(OP中的代碼僅用於說明),所以您的建議全面良好。 – doctororange 2012-04-04 02:38:14