2012-09-29 43 views
1

当在初始fetch之后调用fetch(对用户的操作作出响应)时,许多新抓取的模型可能与初始fetch。如果我使用add: true选项呼叫fetch,则该集合中可能存在重复的模型。Backbone的抓取():仅添加对集合新增的模型

问题:除删除现有的所有车型从集合(与id=1,2,3,4说),并插入新取的模型(id=1,2,3,5),是有可能做到以下2个操作:

  1. 添加只有新机型id=5,导致与id=1,2,3,4,5收集。然后仅渲染新视图(id=5

  2. 添加新模型id=5并删除未在新的fetchid=4)中找到的模型。然后呈现新视图(id=5),并删除旧的意见(id=4

尝试:

与其说App.listingCollection.fetch()的,使用fetchNew()功能。这只适用于将新型号id=5添加到集合中。

如何在不重新渲染现有视图id=1,2,3,4的情况下触发新视图的渲染(id=5)?我内ListingCollection与线new ListingMarkerView({ model:item }).render();尝试这样做,但我在ListingMarkerView得到一个错误响应线var marker = L.marker([this.model.get('lat'), this.model.get('lng')]);

错误

Uncaught TypeError: Object #<Object> has no method 'get' 

收集

ListingCollection = Backbone.Collection.extend({ 
    model: Listing, 
    url: '/api/search_by_bounds', 

    fetchNew: function(options) { 
     options = options || {}; 
     var collection = this, 
      success = options.success; 
     options.success = function(resp, status, xhr) { 
      _(collection.parse(resp, xhr)).each(function(item) { 
       // added this conditional block 
       if (!collection.get(item.id)) { 
        collection.add(item, {silent:true}); 
        new ListingMarkerView({ model:item }).render(); 
       } 
      }); 
      if (!options.silent) { 
       collection.trigger('reset', collection, options); 
      } 
      if (success) success(collection, resp); 
     }; 
     return (this.sync || Backbone.sync).call(this, 'read', this, options); 
    } 
}); 

查看

ListingMarkerView = Backbone.View.extend({ 

    render: function() { 
     var marker = L.marker([this.model.get('lat'), this.model.get('lng')]); 
     markers.addLayer(marker); 
    }, 

    close: function() { 
     this.unbind; 
    } 

}); 
+0

更新:true'做你想要的吗? ''' App.listingCollection.fetch({update:true}); ''' –

回答

3

一个宁静的API没有它使一个GET请求时检索对象的列表说话,因此客户端的状态的概念(例如, http://example.com/restapi/user/),其余服务器应始终返回匹配对象的完整列表。

在骨干端,您应该只收集来自服务器列表的.reset.reset将清空集合,然后添加的所有项目,如:

my_collection.fetch({success: function(collection, resp){ 
    collection.reset(resp, {silent: true}); 
}}); 

这样,你没有得到冲突,你不必担心什么。除非你有已经在本地集合中更改过但尚未保存回服务器的模型。

如果您正在寻找一种方法来防止对集合中的本地项目进行修改,那就需要类似上面提到的魔法。

相关问题