1

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

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

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

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 发送。

我不确定如何以骨干方式执行此操作(我正在寻找标准的东西)。

4

2 回答 2

0

您应该手动$.ajax拨打电话/api/comments/vote/:id并告诉它您是否赞成或反对。然后/api/comments/vote/:id将原子增量或减量发送到数据库中,读出新值,然后将其发回。然后您的成功处理程序$.ajax可以执行set更新客户端值。

您的voteUp实现会遇到一些明显的时间问题:如果您的 JavaScript 中有 6 个赞成票,然后有 11 个其他人赞成,并且您voteUp试图告诉服务器发生了新的赞成票,那么应该有 7 个赞成票,会发生什么?您不应该尝试维护这样的计数器,即使在服务器端代码中也不行。

我想我想说的是没有真正的 Backboney 方法可以做到这一点,有正确的方法和各种不正确的方法。以正确的方式去做,并通过法令声明这就是 Backboney 方式。

于 2013-05-18T07:41:10.723 回答
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

于 2013-05-18T15:56:57.017 回答