使用推动器同步骨干

时间:2014-02-11 23:11:30

标签: ruby-on-rails backbone.js pusher

我正在使用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 。我知道竞争条件并寻找漂亮而强大的解决方案。

感谢!!!

1 个答案:

答案 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);
});

在这个新方法中,在将模型添加到集合之前,迭代集合模型,如果发现它已经存在,则不要再添加它