2014-02-11 76 views
1

我寫使用骨幹+軌的應用程序。
該應用程序允許用戶創建門票,並顯示這些票的實時使用實時服務pusher所有其他用戶。同步處理資料與骨幹推

我的問題是,當用戶創建一張票我把它添加到集合:

addTicket: function(newTicketData) { 
    var newTicket = new app.Ticket(newTicketData); 
    this.collection.add(newTicket, {merge: true}); 
    newTicket.save(null, { 
    wait: true, 
    success: this.addTicketSuccess, 
    error: this.addTicketError 
    }); 
}, 

推杆監聽器代碼:

channel.bind('new_ticket', function(data) { 
    var ticketDataObj = jQuery.parseJSON(data.content); 
    app.ticketsView.addTicket(ticketDataObj); 
}); 

在這一點上,新機型具有CID但不是ID從數據庫中,這可能會在addTicketSuccess回調獲得。 另一方面,服務器在create動作中發送推送器信號,該動作發送具有其ID,但沒有ID的新票券。

結果是集合中的兩個不同的模型,其表示相同的對象,一個具有CID和其他與ID。我意識到比賽條件,並尋找好的和強大的解決方案。

謝謝!

回答

2

CID是一個客戶端ID,並且永遠不會發送給服務器。

當骨幹模型保存被稱爲從服務器成功接收到的數據被設置在同一對象上,而不是創造另一種模式。


所以,你是手動添加兩款車型到您的收藏,嘗試刪除該行:

channel.bind('new_ticket', function(data) { 
    var ticketDataObj = jQuery.parseJSON(data.content); 
    // create a new method addAndMergeTicket 
    app.ticketsView.addAndMergeTicket(ticketDataObj); 
}); 

在這種新方法,你的模型添加到集合之前,通過收集迭代模型,如果你發現它已經存在,不要再添加它

+0

是的,我知道。我的問題是主幹應用程序接收對象兩次 - 一次在'save'回調中,一次通過'pusher'信號(顯然沒有cid)。 這就是爲什麼我有兩個對象 - 一個用__cid__,另一個用__id__。 重要的事情 - 不可能知道哪個是首先執行的 - **保存回調**或**推送器信號回調**。 – guyaloni

+0

你能用推送器代碼更新你的問題嗎? –

+0

剛剛做過,如果您需要更多信息,請告知我。 – guyaloni