2012-02-14 110 views
0

我有以下Backbone.js的模型和收集:爲什麼沒有骨幹視圖檢測模型更改?

// View 
lr.MapView = Backbone.View.extend({ 
    el: $('#wrapper'), 
    initialize: function() { 
    this.date = this.options.date; 
    _.bindAll(this, "render", "addAllEvents", "addOneEvent", "showNextDay", "collectData"); 
    this.collectData(); 
    }, 
    events: { 
    "click #next": "showNextDay", 
    }, 
    collectData: function() { 
    var that = this; 
    if (this.collection) this.collection.reset(); 
    this.collection = new lr.Events([], { date : this.date }); 
    this.collection.fetch({ 
     success: function(resp) { 
     that.render(); 
     that.addAllEvents(); 
     } 
    });  
    }, 
    showNextDay: function() { 
    this.date = this.date.add(1).days(); 
    this.collectData(); 
    }, 
    addAllEvents: function() { 
    this.collection.each(this.addOneEvent); 
    }, 
    addOneEvent: function(e) { 
    var ev = new lr.EventView({ 
     model: e, 
     parentView: this 
    }); 
    }, 
    ... 
}); 

// Sub-view 
lr.EventView = Backbone.View.extend({ 
    initialize: function() { 
    var that = this; 
    this.model.bind('change', function() { 
     console.log('foo'); 
     that.remove(); 
    }); 
    } 
    ... 
}); 

我試圖子視圖改變綁定:這與視圖及其子視圖中使用

// Model 
lr.Event = Backbone.Model.extend({}); 

// Collection 
lr.Events = Backbone.Collection.extend({ 
    model: lr.Event, 
    initialize: function(models, options) { 
    this.date = options.date; 
    }, 
    url: function() { 
    return '/events' + '?date=' + this.date.toString('yyyy-MM-dd'); 
    } 
}); 

到其相關模型。所以我希望當我打電話給this.collection.reset()時,console.log('foo')會被調用。但事實並非如此。我之前和之後編輯了集合,我重置它之後,它肯定會從「某事到無」,所以我假設我在某種程度上搞亂了子視圖與模型的綁定。

任何人都看到錯誤?

回答

2

調用reset()與沒有模型清空收集,但沒有'改變'現有的模型。 'change'事件發生時的某些屬性的型號爲changes。調用reset()確實會觸發集合本身上的「重置」事件(也會在您獲取集合時觸發);當它被觸發時,您還應該重置您的UI,創建並呈現所有子視圖項目(in your case, it looks like you would call render and addAllEvents when you get the reset event)

this.collection.on('reset', this.removeExistingEventViewsThenAddAllEvents, this); 

現在,當一個事件模型的某些屬性不會改變,你打你更改處理:

this.model.bind('change', function() { 
    console.log('foo'); 
    that.remove(); 
}); 

但是,我真的懷疑你要刪除時,事件視圖模型改變。更有可能的是,你想重新渲染它,或者使用JQuery更新它的一部分。

+0

完整意義。謝謝! – AdamVickers 2012-02-15 00:27:47

0

collection.reset()backbone.js v0.91,609行)僅在靜默移除並可選地重新填充集合後才觸發reset事件。

collection.remove(model(s));(線548)觸發每個模型remove事件,因此您可以使用 collection.remove(collection.models);觸發每個模型remove事件。

+0

骨幹文檔說「調用'collection.reset()'不傳遞任何模型作爲參數將清空整個集合」。如果整個集合清空了,那是不是意味着所有的模型都會被刪除,並因此而改變? http://documentcloud.github.com/backbone/#Collection-reset – AdamVickers 2012-02-14 14:42:54

+0

那麼,源代碼似乎做了我上面描述的。也許這對骨幹團隊來說是值得的一個bug報告/功能建議。 – biziclop 2012-02-14 14:47:34