Backbone:我正在尝试获取一个集合(使用rails服务器)。但是,我的提取看起来并没有正常工作

时间:2015-03-30 18:51:26

标签: javascript backbone.js fetch

我正在使用一个rails服务器,它在转到' / todos'时会返回这个JSON对象。路由。

[{"id":1,"description":"yo this is my todo","done":false,"user_id":null,"created_at":"2015-03-19T00:26:01.808Z","updated_at":"2015-03-19T00:26:01.808Z"},{"id":2,"description":"Shaurya is awesome","done":false,"user_id":null,"created_at":"2015-03-19T00:40:48.458Z","updated_at":"2015-03-19T00:40:48.458Z"},{"id":3,"description":"your car needs to be cleaned","done":false,"user_id":null,"created_at":"2015-03-19T00:41:08.527Z","updated_at":"2015-03-19T00:41:08.527Z"}]

我正在将此代码用于我的收藏。

var app = app || {};
var TodoList = Backbone.Collection.extend({
  model: app.Todo,
  url: '/todos'
});
app.Todos = new TodoList();

但是,在尝试获取数据时,它表明该对象未定义。我原本以为我的函数没有正确解析JSON。但是,事实并非如此。我创建了一个包含调试器的解析函数来查看响应。在返回时,一个包含三个对象的数组。

当我尝试测试fetch()时会发生什么。

var todos = app.Todos.fetch()
todos.length // returns undefined
todos.get(1) // TypeError: undefined is not a function

todos集合不会自动在控制台中填充函数get()。我对可能出现问题的想法已经不多了。请帮忙。谢谢!

2 个答案:

答案 0 :(得分:1)

Fetch是一个同步的,你需要听取add事件:

var todos = app.Todos.fetch()
todos.on('add', function(model){
  console.log(todos.length);
});

如果您通过参数重置,您可以收听新模型:

var todos = app.Todos.fetch({reset: true})
todos.on('reset', function(model){
  console.log(todos.length);
});

您还可以阅读here

答案 1 :(得分:0)

有两个问题:

  1. Fetch是异步的;我们不确切知道什么时候会有结果,但我们知道当你调用todos.length时它不会存在。
  2. Fetch在收到回复时设置集合的内容;调用app.Todos.fetch()将导致app.Todos包含请求获取的任何模型。它的返回值对于检查集合没有用,因此var todos = app.Todos.fetch()在任何情况下都不会给你你想要的东西。
  3. 如果您想检查从服务器收到的内容,最好的选择是设置成功回调:

    app.Todos.fetch({
      success: function (collection, response, options) {
        console.log(collection);
      }
    });