【问题标题】:Backbone: fetch collection from serverBackbone:从服务器获取集合
【发布时间】:2011-03-31 14:36:30
【问题描述】:

我正在尝试从我的服务器获取一个集合。 我使用的是 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() 方法中,原因是我的元素是一个字符串列表...我的服务器发送错误。

【问题讨论】:

  • 你说你的服务器发错了;您现在如何发送它们以使其有效?可能对其他人有帮助(比如我)
  • 而不是 ["id1", "id2", ..., "idn"] 客户端期望 [{"id": "id1"}, ... {"id": " idn"}]
  • 我实际上是在从我的服务器中回显 '[{"id":"100"}]' 来测试它......但是,它仍然给出了同样的错误......你的回声部分是什么样的?

标签: javascript jquery rest backbone.js


【解决方案1】:

由于您已经确定您的响应格式不是 Backbone 所期望的,您应该重写 YourModel.parse 函数,该函数应该从您的服务器获取响应并返回集合可接受的模型数组。这是来自 Backbone.js 的 sn-p

// **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;
},

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

附: id 建议在 Backbone.fetch 方法中放置一个断点,以查看来自服务器的格式以及它破坏模型创建的确切位置。

【讨论】:

  • Backbone 期望每条记录都有一个键“id”(您可以通过重新声明 idAttribute 来重新定义模型中的唯一标识符键)。然后从集合中获取需要一个 [] json 数组。
  • 好吧,“id”属性只是用来判断模型是新模型还是现有模型(意思是保存时,我们需要创建还是更新它?)。这里发生的错误发生在从服务器获取模型时,所以我相信问题是错误的响应格式没有被 JSON 正确解析为对象,或者它根本不是 Backbone 期望的格式,因此需要是在“解析”功能中打磨
【解决方案2】:

而不是

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

客户期望

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

【讨论】:

  • 这件事总是让我对 JSON 感到困惑 :( 我们应该选择什么格式。不是说 JSON 不好,我可能需要阅读一下
  • 好吧,我也遇到了同样的问题。在我的情况下,服务器以与您在此处规定的格式相同的格式为我提供 json...我仍然遇到相同的错误,请您帮忙...这是错误和数据:Uncaught TypeError: Cannot use 'in'运算符在 [{"UserId":1,"Login":"test","isSelected":true},{"UserId":2,"Login":"afdsafdsf","isSelected" 中搜索“长度”: true},{"UserId":61,"Login":"werewrewman","isSelected":false},{"UserId":62,"Login":"ghfgu","isSelected":false},... ..]...非常感谢您的帮助..谢谢。
  • JSON 需要采用这种格式的原因是因为这正是 Backbone 的设计目标。每个模型都有一个id 属性see the documentation for Model.id。 Backbone 正在尝试从文本字符串数组创建模型集合——这不会起作用,因为模型不仅仅是单个文本字符串。但是,如果您传递一个对象数组并将 id 属性设置为字符串,Backbone 可以使用数组中的每个对象扩展每个模型对象,从而将每个模型的 id 设置为文本字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 2012-01-04
相关资源
最近更新 更多