Backbone:从服务器获取集合

时间:2011-03-31 14:36:30

标签: javascript jquery rest backbone.js

我正在尝试从我的服务器获取一个集合。 我使用的是0.3.3版本(不是github的主人) 但是我正在运行这个例外:

Uncaught TypeError: Cannot use 'in' operator to search for 'id' in {id=MyId, active=true}
    jQuery.jQuery.extend._Deferred.deferred.resolveWith (jquery.js:869)
    done (jquery.js:6591)
    jQuery.ajaxTransport.send.callback

这是我创建错误的方式:

var MyModel = Backbone.Model.extend();
var MyCollection = Backbone.Collection.extend({
    url: '/api/collection',
    model: MyModel
});
var coll = new MyCollection();
coll.fetch();

/ api / collection中的元素在JSON中解析。 我试图以各种格式返回它们

["Id1", "Id2", ... ]
[{id: "Id1, somethingElse: "..."}, ...]
{id1: { id1s content}, id2: { ... }, ...}

然而,错误总是一样的。 这段代码有什么问题?

[编辑] 通过coll.fetch({error: errorFunc});设置错误无效。异常保持不变。

[Edit2] 好吧,似乎一切正常,直到collection.fetch()使用响应对象调用collection.refresh()。我没有覆盖任何这些功能。

[Edit3] 错误在collection.add()方法中,原因是我的元素是字符串列表...我的服务器发错了。

2 个答案:

答案 0 :(得分:23)

由于您已经确定您的响应格式不是Backbone所期望的,因此您应该覆盖应该从服务器获取响应的 YourModel.parse 函数,并返回集合可接受的模型数组。以下是Backbone.js的片段

// **parse** converts a response into a list of models to be added to the
// collection. The default implementation is just to pass it through.
parse : function(resp) {
  return resp;
},

正如您所看到的,默认函数只是传递数据。您必须使其适用于您的响应格式。

P.S。 id建议在Backbone.fetch方法中放置一个断点,以查看来自服务器的格式以及它在哪里打破模型创建。

答案 1 :(得分:20)

而不是

["id1", "id2", ..., "idn"]

客户期望

[{"id": "id1"}, ... {"id": "idn"}]