【问题标题】:Syncronizing backbone with pusher将主干与推送器同步
【发布时间】:2014-02-11 23:11:30
【问题描述】:

我正在使用骨干网 + 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。我知道比赛条件,并正在寻找好的和强大的解决方案。

谢谢!!!

【问题讨论】:

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


    【解决方案1】:

    cid 是客户端 ID,永远不会发送到服务器。

    当 Backbone 模型保存被成功调用时,从服务器接收到的数据被设置在同一个对象上,而不是创建另一个模型。


    所以您正在手动将这两个模型添加到您的收藏中,请尝试删除此行:

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

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

    【讨论】:

    • 是的,我知道。我的问题是主干应用程序接收到对象两次——一次在save 回调中,一次通过pusher 信号(显然没有cid)。这就是我有两个对象的原因——一个带有cid,另一个带有id。重要的事情 - 不可能知道哪个先执行 - 保存回调推送信号回调
    • 刚刚做了,如果您需要更多信息,请告诉我。
    • 不,不好。可能我解释得不好。每当添加新票时,都会调用推送器回调。可能是同一用户,也可能是其他人。这就是为什么这个回调应该调用addTicket。据我所知,此回调无法知道是同一用户引发了此呼叫还是其他用户。
    • 我更新了我的答案,希望这次我能理解你的问题:)
    • 只有一件事 - 因为可能会首先调用推送回调(奇怪但可能会发生)我需要始终调用新方法addAndMergeTicket
    猜你喜欢
    • 2013-01-24
    • 2015-03-26
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2012-05-18
    • 2012-09-30
    相关资源
    最近更新 更多