向现有模型添加更多数据(backbone.js)

问题描述:

为集合完成的初始fetch将检索每个模型的部分详细信息。当用户点击网页上的项目时,需要检索该项目的更多细节并将其显示给用户。向现有模型添加更多数据(backbone.js)

返回在该项目的初始提取中丢失的额外数据的API函数已经实现(/api/full_details)。

问题:如何检索附加并将其附加到现有模型?我的理解是,如果我做了model.fetch(),那么该模型中的现有数据将会消失。我认为如果fetch()对于模型有一个选项{add:true}像集合fetch(),这将是我需要在这里。

型号

Listing = Backbone.Model.extend({ 
}); 

收集

ListingCollection = Backbone.Collection.extend({ 
    model: Listing, 
    url: '/api/search' 
}); 

查看

ListingListView = Backbone.View.extend({ ........ }); 

ListingView = Backbone.View.extend({ 
    events: { 
     'click': 'getFullDetails' 
    }, 

    getFullDetails: function() { 
     // What should I do here? 
    } 
}) 

某处在路由器

this.listingList = new ListingCollection(); 
var self = this; 
this.listingList.fetch({ 
    data: {some:data}, 
    processData: true, 
    success: function() { 
     self.listingListView = new ListingListView({ collection: self.listingListNew }); 
     self.listingListView.render(); 
    } 

我可能会使用两个单独的模型如下:

  1. 您现有的模式将成为ListingSummary和您的收藏将包含ListingSummary实例。
  2. 为完整版本创建新的Listing(或ListingFull)模型。这将得到/api/full_details的支持。

你可以使用你已经在你的总结模型的信息初始化全型号:

var ListingSummary = Backbone.Model.extend({ 
    //... 
    getListing: function() { 
     if(!this._full) { 
      this._full = new Listing({ summary: this }); 
      this._full.fetch(); 
     } 
     return this._full; 
    } 
}); 

,然后通过在完整版:

var Listing = Backbone.Model.extend({ 
    initialize: function() { 
     if(this.options.summary) { 
      // Copy the interesting bits from this.options.summary.attributes 
      // to this.attributes, possibly using this.set() 
     } 
    } 
}); 

那么你的完整列表,查看可以检查它的Listing是否完全加载:如果是,那么视图可以显示完整的列表,但是如果模型还没有全部存在,视图可以显示那里是什么,并抛出一个微调器/加载器/ th强盗/无论你何时打电话 - 它在等待服务器响应的完整Listing模型;像往常一样,您的视图将列出模型中的事件,以了解什么时候一切准备就绪。

你可以做你的现有Listing模型同样的事情,你只火了一个原始$.ajax调用,而不是使用一个单独的模型:

loadFullModel: function() { 
    if(this._fullyLoaded) 
     return; 
    // Call out to /api/full_details ... 
    var _this = this; 
    $.ajax({ 
     //... 
     success: function(data) { 
      // Do things with data... 
      _this._fully_loaded = true; 
      // Trigger your event... 
     } 
    }); 
}