2012-02-14 61 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