为什么Backbone.Collection.fetch什么都没得到?

时间:2013-12-19 03:29:43

标签: json backbone.js

我是BackboneJS的新手。我尝试了它的演示,但messages.fetch()没有任何结果。我重写Backbone.sync函数返回一个json,但messages.length总是0.这是我的代码:

var Message = Backbone.Model.extend({});
var MessageStore = Backbone.Collection.extend({
    model: Message
});
Backbone.sync = function() {
    return [{"content":"Hi there","id":1},{"content":"How are you?","id":2}];
}
var messages = new MessageStore;
messages.fetch();
console.log(messages.length);          // 0
console.log(JSON.stringify(messages)); // []

我不知道哪里出错了。剂量反应必须是一定的结构?

1 个答案:

答案 0 :(得分:2)

Backbone.sync用作读取/写入服务器的传输机制,可以通过覆盖它来自定义,如documentation中所述。默认情况下,Backbone.sync会返回XMLHttpRequest个对象。

通常,fetch是一个异步调用,但是当你过度使用Backbone.sync时,你把它扔出了窗口,现在所有fetch返回都是

[{"content":"Hi there","id":1},{"content":"How are you?","id":2}];

因此,如果您执行console.log(messages.fetch());,您会看到上述内容,但messages集合中没有任何更改。

让我们假设我们没有触及Backbone.sync以下示例,回到主题。我认为您正在寻找Backbone.Collection的{​​{3}}方法。

var Messages = Backbone.Collection.extend({
  url:'/someurl',
  parse:function(response) {
    // by default response is returned, but you can manipulate the response here.
    // given your example - we just return the static content - will be set on collection
    return [{"content":"Hi there","id":1},{"content":"How are you?","id":2}];
  }
});

//instantiate the new collection
var messages = new Messages();

messages.fetch({
  success:function() {
    console.log(messages.toJSON(),messages.length);
  }
});

还记得我提到fetch是异步的吗?请求完成后,您需要检查fetch的结果,这就是您需要提供success回调的原因。

您可以看到此演示parse