0

我正在做一些练习来熟悉 Backbone。我正在尝试urlRoot使用Model.

我收到错误(404),说它在我键入时找不到文件,urlRoot: "./js/json/todo"但如果我以这种方式键入它,urlRoot: "./js/json/todo.json"它会找到它,但会console.log(todoItem.get('description'))undefined

现在,在我见过的许多 Backbone 应用程序中,大多数情况下.json都没有应用扩展名,即这足以urlRool: "/todos"代替urlRoot: "/todos.json". 但是,当我在没有扩展名的情况下执行此操作时,会出现错误。

  • 有人可以向我解释如何正确使用urlurlRoot属性吗?
  • 而且,不使用.json或使用它有什么问题?
  • 最后,我的 JSON 文件格式是否适用于 Backbone?

骨干:

(function(window, $, Backbone) {
    var TodoItem = Backbone.Model.extend({ urlRoot: './js/json/todos' });

    var todoItem = new TodoItem({id: 1});

    todoItem.fetch();

    console.log(todoItem.get('description')); // This is undefined in the console

}(window, jQuery, Backbone));

JSON:

{
    "todos": [
    {
        "description": "Pick Up Milk",
        "status": "incomplete"
    },

    {
        "description": "Do shopping at Market",
        "status": "incomplete"
    }]
}
4

2 回答 2

1

你没有看到它,.json因为有人使用的后端是从 url 返回 JSON 而没有.json. 当我有一个静态 JSON 文件时,我只是添加.json到它。

这一切都与服务器设置或您处理 url 的任何内容有关。

就您的格式而言,您不需要包装{}. 它可以只是:

[{
    "description": "Pick Up Milk",
    "status": "incomplete"
},

{
    "description": "Do shopping at Market",
    "status": "incomplete"
}]

因此,当使用静态 JSON 文件时,我的 GET 更加手动:

$.ajax("./js/json/todo.json").done(function(data) {
    // I'm only using extend to add in the id. You could just use data[0]
    var todoItem = new ToDoItem(_.extend(data[0], { id: 1 }));
}

由于您的 JSON 文件是一个集合,因此 Fetch 不会真正起作用。您可以创建:

var ToDoCollection = Backbone.Collection.extend({
    model: ToDoItem,
    url: "./js/json/todo.json"
});
var toDos = new ToDoCollection();
toDos.fetch();

这应该为您提供一个集合,其中包含 JSON 文件中每个条目的模型。

于 2013-07-08T15:43:09.717 回答
1

.json只要端点存在,您是否正在使用都没有关系。所以,如果你命名你的文件todo.json,你必须有.json. 一种测试方法是,您应该能够将文件的 url 剪切并粘贴到浏览器中并使其正确显示。

我相信你是undefined因为你的 JSON 文件的格式。description不存在于对象的顶层。Backbone 需要一个 的数组,Models而不是一个包含 的数组的对象Models。例如:

[{
    "description": "Pick Up Milk",
    "status": "incomplete"
},
{
    "description": "Do shopping at Market",
    "status": "incomplete"
}]

url适用于集合,urlRoot适用于单个模型。这允许您做的是创建一个语义命名模式。例如,要访问 API,我可能会使用以下模式:

GET /todos - Get all todos
GET /todo/:id - Get one todo

我可以通过设置urlto/todosurlRootto来做到这一点/todo。Backbone 将自动附加 ID。记住urlRoot是可选的,只要url被定义。

于 2013-07-09T03:20:07.963 回答