如何使用BackboneJS获取/users/profile和/users/friends



我有一个API,里面有很多url,比如:

/users/profile->获取当前连接的用户/users/好友->获取当前连接的用户的好友(好友中的最好友)/users/wife->获取当前连接的用户的妻子/users/friends->获取当前连接的用户的好友/users/好友->获取当前连接的用户的好友/users/children->获取当前连接的用户的children/users/neighbors->获取当前连接的用户的邻居

我是Backbone的新手,我真的不知道是否应该以集合或简单模型的形式获取当前连接用户。

我知道当前用户可能会像Backbone文档中提到的那样被夸大,但这不是重点,只是假设我不能夸大当前用户模型。


那么如何将获取重定向到API URL?我应该每次提供{"operation":"profile"}{"operation":"friends"}这样的选项,还是在提取之前修改集合url?

感谢

您必须创建多个模型和集合,其中任何一个都与您的URLS相关。

var Profile = Backbone.Model.extend({
url: "/users/profile"
});
var BestFriend = Backbone.Model.extend({
url: "/users/bestfriend"
});
// ...
var Friend = Backbone.Model.extend({});
var Friends = Backbone.Collection.extend({
model: Friend,
url: "/users/friends"
});

您也可以使用Friend作为BestFriend:的父类

var BestFriend = Friend.extend({
url: "/users/bestfriend"
});

或者甚至为每个人创建一个Person类作为父类:

var Person = Backbone.Model.extend({});
var Friends = Backbone.Collection.extend({
model: Person,
url: "/users/friends"
});
var Profile = Person.extend({
url: "/users/profile"
});
var BestFriend = Person.extend({
url: "/users/bestfriend"
});

由于您有单独的URLS来检索每个元素的数据,因此您应该进行多次提取:

var profile = new Profile();
var bestFriend = new BestFriend();
var friends = new Friends();
profile.fetch();
bestfriend.fetch();
friends.fetch();

您可以使用以下内容将所有元素引用到Profile实例中:

var Profile = Person.extend({
url: "/users/profile",
initialize: function( opts ){
this.bestFriend = opt.bestfriend;
// ...
}
});
var bestFriend = new BestFriend();
var friends = new Friends();
var profile = new Profile({
bestfriend: bestfriend
});

有几种方法可以组织元素,也可以收听事件,但所有这些都只是品味的问题,以及你更喜欢哪种架构。

如果希望在集合的"外部"使用模型,请使用model.urlRoot属性来指定模型的URL。如果是新模型(即id==null),它会自动在URL的末尾附加一个id,并在创建时发送POST。否则,它将在指定的url处获取(GET)。

如果您不想在末尾附加id:只需覆盖model.url即可生成您想要获取/放置/发布到的实际端点URL。

集合还有一个名为url的属性——如果没有指定模型的url或urlRoot,则集合的url将被选为根(如果该模型是集合的一部分)。

所以你可以做以下任何一个:

model.urlRoot = '/users/profile'; //appends id on put/delete requests
model.url = '/users/profile'; //direct endpoint. Can also be a function
collection.url = '/users/friends'; //fetch endpoint for collection. Could also be used by models to put to with appended id.

Backbone的文档非常全面且不言自明。我建议你阅读这些部分,例如Model.urlRoot

更新:根据您的新URL

我认为这种混乱是因为URL的设计方式。将端点设为复数/单数是不好的做法:

例如:/user/friends-很好的得到用户的所有朋友。但是哪个用户?更好的是:/users/{id}/friends-获取特定用户的朋友。

为用户获取特定好友:/users/{id}/friends/{id}

我建议在URL中添加id,以充分利用主干网内置的REST功能。否则,只需定义自己的属性和逻辑,并使用单独的函数(如"save")来触发$.ajax调用,并对成功/错误回调执行操作。

它们是模型还是系列将完全取决于您。幸运/不幸的是,在Backbone中有不止一种方法可以做到这一点。如果你遵循BB的方式,它将提供一种更干净的做事方式,因为框架期望并遵循某些约定。如果没有,则始终可以自定义创建。我做了两种方式。自定义创建似乎更容易,遵循惯例需要一些规划,但它保持了更干净——尽管"隐藏/抽象"了程序员的东西,而显式ajax调用使其显式。

这是一种权衡。我建议重组你的端点并相应地使用url属性。否则,只要做对你和你的团队有意义的事情,并坚持下去。

基本上我同意第一个答案,但为了简单起见,您可以开始为用户使用id并单独获取它们。这可能会产生一些额外的负载,但在需要优化之前,它应该会保持代码的整洁。

您可能会遇到当前API设计的问题。如果将来你想要妻子最好的朋友怎么办?你会有一个url为"/user/weither"的对象,然后你会说"/user/Weither/bestfriend"。接下来,有人想扩大这一范围,并拥有"/user/妻子/最好的朋友/孩子/"。在后端进行解析会比较复杂。

从本质上讲,不是单独呼叫妻子和孩子,而是让配置文件呼叫返回相关用户的ID:

/profile
{
id: 165735,
name: "Peter",
age: 45,
wifeId: 246247,
childrenIds: [352356, 134098]
}

那么接妻子只需:

/users/246247

这将使妻子成为真正的用户,而不仅仅是某人的妻子。在检索用户时,您可以在此处检查安全性,因为您无论如何都将关系存储在数据库中。

相关内容

最新更新