使用backbonejs进行评论的投票API

时间:2013-05-18 03:29:32

标签: backbone.js

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

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

我对每个评论都有一个投票或投票按钮,就像SO一样。我想调用位于

的REST API
POST /api/comments/vote/:id

还传递参数“方向”(向上或向下)。

在我的评论视图中,我有一个函数调用另一个函数,它的注释模型如下:

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实际调用注释API并将所有参数作为POST发送。

我不知道如何以脊柱方式做到这一点(我正在寻找标准的东西)。

2 个答案:

答案 0 :(得分:0)

您应该对$.ajax进行手动/api/comments/vote/:id来电,并告诉您是否有upvote或downvote。然后/api/comments/vote/:id将原子递增或递减发送到数据库,读出新值,然后发回。然后,$.ajax的成功处理程序可以set更新客户端值。

您的voteUp实施受到一些明显的时间问题的影响:如果您的JavaScript中有6个upvotes,然后其他11个人投票,并且您的voteUp尝试告诉服务器新的upvote已经发生,所以应该有7个upvotes?您不应该尝试维护这样的计数器,甚至不要在服务器端代码中维护。

我想我想说的是没有Backboney方法可以做到这一点,有正确的方法和各种不正确的方法。以正确的方式做,并通过命令宣布这是Backboney方式。

答案 1 :(得分:0)

我认为标准方法是利用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