2013-05-18 64 views
1

我刚开始尝试backbone.js,并在设计我的第一个前端模块时遇到了障碍。以下是我的:评论骨干网的投票API

我遵循基本的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发送。

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

+0

对我来说很不错! –

+0

你是什么意思?我需要从'voteUp'里面调用'POST/api/comments/vote /:id'。我怎么做? – kapeels

+0

啊,我明白了。我已经在下面留下了一个提案。 –

回答

0

你应该做一个手动$.ajax呼叫/api/comments/vote/:id并告诉它,如果你有upvote或downvote。然后/api/comments/vote/:id会发送一个原子增量或减量到数据库中,读出新的值,并将其返回。然后,您的$.ajax的成功处理程序可以执行set来更新客户端值。

voteUp实施受到一些明显的时序问题:如果你在你的JavaScript有6个upvotes会发生什么,那么其他11人给予好评,和你voteUp试图告诉已经发生了新的给予好评的服务器,所以应该有7 upvotes?您不应该尝试维护这样的计数器,即使在服务器端代码中也是如此。

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

+0

API调用只会告诉服务器增加或减少,而不是增加到某个值(如您在示例中提到的7)。其中一个返回值也包括最新的投票计数,我可以使用它来更新模型和视图。 – kapeels

+0

因此,您根本不需要'save'调用,只需一个简单的'.ajax'调用即可触发'set'来更新计数器。 –

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