我正在使用backbone + rails编写应用程序 该应用程序允许用户创建故障单,并使用实时服务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 。我知道竞争条件并寻找漂亮而强大的解决方案。
感谢!!!
答案 0 :(得分:2)
cid 是客户端ID,永远不会发送到服务器。
当成功调用Backbone模型保存时,从服务器接收的数据将设置在同一对象上,而不是创建另一个模型。
因此,您手动将两个模型添加到您的收藏集中,尝试删除此行:
channel.bind('new_ticket', function(data) {
var ticketDataObj = jQuery.parseJSON( data.content );
// create a new method addAndMergeTicket
app.ticketsView.addAndMergeTicket(ticketDataObj);
});
在这个新方法中,在将模型添加到集合之前,迭代集合模型,如果发现它已经存在,则不要再添加它