我正在做一些练习以熟悉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
或使用它的问题是什么?骨干:
urlRoot
JSON:
.json
答案 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
就是可选的。