2014-02-11 156 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