使用backbonejs为评论投票API

Posted

技术标签:

【中文标题】使用backbonejs为评论投票API【英文标题】:Voting API for comments with backbonejs 【发布时间】:2013-05-13 07:00:53 【问题描述】:

我刚刚开始尝试使用backbone.js,并且在使用它设计我的第一个前端模块时遇到了障碍。这是我所拥有的:

我遵循了基本的待办事项教程,并在我的自定义 REST API 上创建了一个评论系统。一切都很好。

就像 SO 一样,我对每条评论都有一个赞成或反对的按钮。我想调用位于

的 REST API
POST /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的主要内容,如果未能解决你的问题,请参考以下文章

Django Web开发 投票与评论

mvc4中使用angularjs实现一个投票系统

BackboneJs 中的多个路由器与单个路由器

Bootstrap 3 + backbonejs - 切换导航无法打开

按他们获得的点数排序评论,Laravel 5.2 多态关系

如何在BackboneJS模型中的所有AJAX调用中添加自定义HTTP标头?