使用backbonejs为评论投票API
Posted
技术标签:
【中文标题】使用backbonejs为评论投票API【英文标题】:Voting API for comments with backbonejs 【发布时间】:2013-05-13 07:00:53 【问题描述】:我刚刚开始尝试使用backbone.js,并且在使用它设计我的第一个前端模块时遇到了障碍。这是我所拥有的:
我遵循了基本的待办事项教程,并在我的自定义 REST API 上创建了一个评论系统。一切都很好。
就像 SO 一样,我对每条评论都有一个赞成或反对的按钮。我想调用位于
的 REST APIPOST /api/comments/vote/:id
还传递了一个参数“方向”(向上或向下)。
在我的 cmets 视图中,我有一个函数调用另一个函数,它是 cmets 模型,如下所示:
vote_up: function()
this.model.voteUp();
return false;
模型中的函数:
voteUp: function()
var up_votes = this.get('up_votes') - 0;
up_votes++;
this.save(up_votes: up_votes);
我很确定我在这里不需要this.save
,它实际上调用 cmets API 并将所有参数作为 POST 发送。
我不确定如何以骨干方式执行此操作(我正在寻找标准的东西)。
【问题讨论】:
什么意思?我需要从voteUp
内部致电POST /api/comments/vote/:id
。我该怎么做?
啊,我明白了。我在下面留下了一个提案。
【参考方案1】:
您应该手动向/api/comments/vote/:id
拨打$.ajax
并告诉它您是否赞成或反对。然后/api/comments/vote/:id
将向数据库发送一个原子增量或减量,读出新值并将其发回。然后$.ajax
的成功处理程序可以执行set
来更新客户端值。
您的voteUp
实现存在一些明显的时间问题:如果您的 javascript 中有 6 个赞成票,然后有 11 个其他人赞成,并且您的 voteUp
试图告诉服务器发生了新的赞成票,那么会发生什么?应该有7个赞成票?您不应该尝试维护这样的计数器,即使在服务器端代码中也不行。
我想我想说的是没有真正的 Backboney 方法可以做到这一点,有正确的方法和各种不正确的方法。以正确的方式做事,并通过法令声明这就是 Backboney 方式。
【讨论】:
API 调用只会告诉服务器递增或递减,而不是递增到某个值(如您在示例中提到的 7)。其中一个返回值还包括最新的投票计数,我可以使用它来更新模型和视图。 因此您根本不需要save
调用,只需一个简单的$.ajax
调用即可触发set
来更新计数器。【参考方案2】:
我认为标准方法是利用 Backbone 的 urlRoot 属性。
var Vote = Backbone.Model.extend(urlRoot : '/api/comments/vote');
// ....in comments view:
vote_up: function()
// send HTTP Post '/api/comments/vote/' -- server will create ID
new Vote(direction: 1).save()
return false;
如果您立即需要 Id,或者对成功插入做出反应,您可以将 success
回调传递给 save
。
见:http://backbonejs.org/#Model-save
【讨论】:
以上是关于使用backbonejs为评论投票API的主要内容,如果未能解决你的问题,请参考以下文章