Backbone.js 和 Backbone 实现的最佳 URL 结构
Posted
技术标签:
【中文标题】Backbone.js 和 Backbone 实现的最佳 URL 结构【英文标题】:Optimal URL structure for Backbone.js and Backbone implementation 【发布时间】:2013-09-01 22:56:09 【问题描述】:我正在为一个测验应用程序开发一个 RESTful API,它将使用 Backbone.js 和 Marionette 构建。我对骨干很陌生,想知道最好的 URL 结构是什么。我有以下资源:
回答, 包含答案的问题, 包含问题的问题组, 包含问题组的测验。想到两种可能的 URL 结构:
GET /quizzes/:id
GET /quizzes/:id/questiongroups
GET /quizzes/:id/questiongroups/:id
GET /quizzes/:id/questiongroups/:id/questions
GET /quizzes/:id/questiongroups/:id/questions/:id
GET /quizzes/:id/questiongroups/:id/questions/:id/answers
或:
GET /quizzes/:id
GET /quizzes/:id/questiongroups
GET /questiongroups/:id
GET /questiongroups/:id/questions
...
现在,我一直在尝试使用这两个选项。对于第一个,我不知道如何将集合定义为 Backbone 中父模型的属性,以便我可以在它们上使用 fetch()
。第二个选项的问题有点不同:据我了解,Backbone 从其集合中派生模型的 url,但该集合是另一个资源的子资源,而获取单个资源的 url 使用另一个集合,即全局资源集。
我很确定在这两种情况下我都必须覆盖 url()
。我尝试了一些东西,但根本没有想出任何有用的东西。另外,我不想覆盖应用程序中的每一个 url()
-model,更改 API 结构以适应 Backbone 的偏好对我来说似乎是一个更好的选择。
任何关于如何使用 Backbone 的正确方法的指针都会很棒!
谢谢
【问题讨论】:
【参考方案1】:如果questiongroup
s 只能出现在单个quiz
中,那么第一个选项(分层选项)是显而易见的选择。为了遵守 RESTful 约定,您可能需要考虑使用单数名词:/quiz/:id/questiongroups/:id/question/:id/answer/:id
为了解决您的获取问题,我建议按照以下答案使用嵌套主干模型:https://***.com/a/9904874/1941552。我还添加了一个厚脸皮的小parentModel
属性。
例如,您的 QuizModel 可能如下所示:
var Quiz = Backbone.Model.extend(
urlRoot: '/quiz/', // backbone appends the id automatically :)
defaults:
title: 'My Quiz'
description: 'A quiz containing some question groups.'
,
model:
questionGroups: QuestionGroups,
,
parse: function(response)
for(var key in this.model)
var embeddedClass = this.model[key];
var embeddedData = response[key];
response[key] = new embeddedClass(embeddedData,
parse:true,
parentModel:this
);
return response;
);
那么,您的QuestionGroups
模型可能具有以下url()
函数:
var QuestionGroups = Backbone.Model.extend(
// store metadata and each individual question group
url: function()
return this.parentModel.url()+'/questiongroup/'+this.id;
);
或者,如果您不需要存储任何元数据,您可以使用Backbone.Collection
:
var QuestionGroups = Backbone.Collection.extend(
model: QuestionGroup,
url: function()
return this.parentModel.url()+'/questiongroup/'+this.id;
);
恐怕我还没有测试过这些,但我希望它仍然有用!
【讨论】:
以上是关于Backbone.js 和 Backbone 实现的最佳 URL 结构的主要内容,如果未能解决你的问题,请参考以下文章