2012-01-30 56 views
3

我刚开始使用Backbone.js。我想创建一个Collection并从外部源添加一些数据。Backbone.js:使用Ajax将数据绑定到Collection?

数据实际上目前是CSV格式,而不是JSON格式,但如果这样做会更容易,我可以使用JSON重新渲染它。

于是,两个问题:

  1. 我在哪里绑定外部数据集合?它抱怨,如果我没有指定url属性,但我没有真正的URL - 我打算通过Ajax绑定数据。
  2. 我应该以JSON而不是CSV重新呈现我的数据,并使用集合的url属性来加载它?

我只是试图加载数据直接进入收藏,而不是通过url属性:

var Cat = Backbone.Model.extend({}); 
var CatCollection = Backbone.Collection.extend({ 
    model: Cat 
}); 
var ajaxData = { 'breed' : 'persian' } // simple example of external data 
var catCollection = new CatCollection(ajaxData); 
catCollection.fetch(); 

但是,这给出了一个错误:Uncaught Error: A "url" property or function must be specified

+0

但您需要ajax调用的url。 – 2012-01-30 13:42:47

+0

哦,所以如果我指定的URL,它是JSON,它应该“只是工作”?如果URL是CSV文件会发生什么? – Richard 2012-01-30 14:18:18

回答

7

要么初始化/与不使用fetch方法为您收集

var ajaxData = [{ 'breed' : 'persian' }]; // Backbone.Collection expects an array 
var catCollection = new CatCollection(ajaxData); 
// catCollection.fetch(); fetch will try to update the data from the server 

,或者使用内置的URL /解析,以建立自己的模型在其他地方创建数组重置您的收藏

var CatCollection = Backbone.Collection.extend({ 
    model: Cat, 
    url: "your ajax source", 
    parse: function (csv) { 
     //convert your csv in an array of objects 
     return csvtoarray; 
    }, 
    fetch: function (options) { 
     options = options || {}; 
     options.dataType = "text"; 
     return Backbone.Collection.prototype.fetch.call(this, options); 
    } 
}); 
var catCollection = new CatCollection(); 
catCollection.fetch(); 

将数据服务器端转换为JSON可能比试图在JS中编写CSV解析器容易一些。

+0

很好的答案,谢谢。 – Richard 2012-01-30 14:27:40

+1

第二种方法 - 重写解析 - 显然是可取的,但据我所知可能不起作用:同步方法会在未接收JSON时抛出错误,因此永远不会调用解析。我认为你需要做的是重写Backbone.sync和解析。无论如何,我即将为此拍摄一张照片。 – 2014-01-29 17:03:47

+1

@TomP你是对的,它缺少一个数据类型。重写获取应该够用了。 – nikoshr 2014-01-29 17:13:15