2012-10-20 90 views
0

我有一個Backbone視圖,呈現一個日曆,該日曆依次呈現每一天的子視圖。每天都有一個模型和一個單擊事件,可以選擇或取消選擇一天。如果選擇一天,模型將被保存,如果未選中,模型將被銷燬。在Backbone中,一旦模型被破壞,如何替換視圖的模型?

一旦視圖的模型被破壞(因爲日期被取消選擇),我不知道如果日期被重新選擇,如何在日曆日期集合中保存新模型。該視圖只知道模型 - 與收藏無關。日曆視圖是否應該在模型銷燬時創建並附加新模型到日期視圖?還是應該通過收集日期視圖,並自己做到這一點?還是有更好的解決方案?

這裏是我的代碼的某些代碼段爲清楚:


var CalendarView = Backbone.View.extend({ 
    initialize: function() { 
    this.model.dates.on('reset', this.renderDates, this); 
    }, 

    renderDates: function() { 
    // Loop through the number of days to display and create a view for each. 

     // Find a model for the date. If one doesn't exist, this returns a new model. 
     model = this.model.dates.completedOn(date.format('YYYY-MM-DD')); 

     view = new DateView({ 
     model: model 
     }); 

     $dates.append(view.render().el); 

    // End loop. 
    } 
}); 

var DateView = Backbone.View.extend({ 
    events: { 
    'click .date': 'toggleDate' 
    }, 

    toggleDate: function() { 
    if (this.model.selected()) { 
     this.model.destroy(); 
    } 
    else { 
     this.model.save(); 
    } 
    } 
}); 

感謝您的幫助!

回答

2

聽起來像是你應該有一個設置是這樣的:

  1. 一個Backbone.Model選定的日期。我們將這個稱爲M
  2. A Backbone.Collection可容納所有M型號。我們將這個稱爲C
  3. A Backbone.View,​​,表示單個選定日期,model財產將是M
  4. A Backbone.View,VC,代表整個月(或年份或任何您顯示的),collection財產將是一個C

然後VC可以監聽其收集'add'事件,並在新選定的日期被添加到C中的適當位置插入一個​​。

C中刪除M也是相當直接的。 Any event on a model will also be triggered on its collection(如果有的話)。所以要取消選擇日期,只需簡單地銷燬模型。 VC可以收聽其收藏上的'destroy'事件,根據需要清除​​及其整體顯示。

這種方式花費大部分時間與收藏品交談來管理您選擇的日期,並且通過響應適當的事件來處理所有其他事情。

下面是一個快速演示,它應該會告訴你這些碎片是如何融合在一起的:http://jsfiddle.net/ambiguous/TYMTM/