Backbone:从服务器获取JSON文件,使用扩展名“.json”或不使用它,使用url或urlRoot

时间:2013-07-08 15:40:15

标签: javascript json backbone.js

我正在做一些练习以熟悉Backbone。我正在尝试使用urlRoot的{​​{1}}属性从我的服务器获取JSON文件。

我收到错误(404),说我在输入Model时无法找到该文件但是如果我这样输入urlRoot: "./js/json/todo"那么它会找到它但urlRoot: "./js/json/todo.json"说{{1} }}

现在,在我见过的许多Backbone应用程序中,大部分时间都没有应用扩展console.log(todoItem.get('description')),即这足以undefined而不是.json。但是当我没有扩展时,我就会出错。

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

骨干:

urlRoot

JSON:

.json

2 个答案:

答案 0 :(得分:1)

您看到它没有.json,因为有人使用的后端正在从没有.json的网址返回JSON。当我有一个静态JSON文件时,我只需要添加.json

关于服务器设置或处理网址的所有内容。

就您的格式而言,您不需要换行{}。它可以只是:

[{
    "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文件中每个条目的模型。

答案 1 :(得分:1)

只要端点存在,您是否使用.json无关紧要。因此,如果您将文件命名为todo.json,则必须.json。测试这种方法的一种方法是,您应该能够将文件的网址剪切并粘贴到浏览器中,并使其正确显示。

由于JSON文件的格式,我相信你得到undefined。对象的顶层不存在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

我可以将url设置为/todos,将urlRoot设置为/todo。 Backbone将自动附加ID。请注意,只要urlRoot已定义,url就是可选的。