2013-05-18 106 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