【问题标题】:Voting API for comments with backbonejs使用backbonejs为评论投票API
【发布时间】: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。我该怎么做?
  • 啊,我明白了。我在下面留下了一个提案。

标签: backbone.js


【解决方案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

【讨论】:

    猜你喜欢
    • 2012-02-22
    • 1970-01-01
    • 2014-03-15
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多