【问题标题】:Emitting a Backbone.js Model through Socket.io通过 Socket.io 发出 Backbone.js 模型
【发布时间】:2012-04-12 20:03:41
【问题描述】:

基本问题
我正在尝试通过 socket.emit() 发送一个对象,但该对象没有被完全发送。我可能只是误解了如何执行此操作,但这是示例:

console.log(object)

结果

{ length: 8,
  models:
   [ { attributes: [Object],
       _escapedAttributes: {},
       cid: 'c1',
       changed: {},
       _silent: {},
       _pending: {},
       _previousAttributes: [Object],
       lots: [Object],
       _changing: false,
       collection: [Circular],
       _callbacks: [Object] },
    ... ETC

虽然

socket.emit(e,object);

结果:

{"name":"read:AllAuctions","args":
[[{"auctionId":"298"},{"auctionId":"381"},{"auctionId":"385"},
{"auctionId":"393"},{"auctionId":"394"},{"auctionId":"395"},
{"auctionId":"402"},{"auctionId":"800"}]]}

以后一种格式到达前端。

更多细节
我创建了一个服务器,它试图使用 socket.io 更新客户端骨干模型。其中一些正在使用此处指定的想法:

http://developer.teradata.com/blog/jasonstrimpel/2011/11/backbone-js-and-socket-io

不同之处在于我在后端创建了主干模型。我的逻辑是共享基本模型文件,并让后端处理与持久层通信并保持“真实”数据源优化,然后响应获取这些模型/集合的请求以及自动推送更新.

一切似乎都在工作,但我应该将模型转移到前端。我是否需要扩展/覆盖 toJSON 或其他实际将其转换为传输的方法?如果是这样,我该怎么做?您能给我的任何帮助将不胜感激!

【问题讨论】:

    标签: node.js backbone.js socket.io


    【解决方案1】:

    我认为您应该只发送数据并在客户端重新创建对象。

    因此您可以尝试使用 Backbone Collection 的 toJSON

    socket.emit(e, object.toJSON());
    

    【讨论】:

    • 我认为这也可能是问题所在,但它的作用相同。我是否有可能需要覆盖该集合的 toJSON 方法,以确保它也返回每个子模型的完整主体?我试过了,但我可能做错了,因为它返回了同样的东西。
    • 感谢您的帮助!事实证明,套接字已经尝试使用 toJSON 对其进行编码,但我的 toJSON 函数只返回集合中模型的属性。
    【解决方案2】:

    在发送之前使用 JSON.stringify 并在另一端使用 JSON.parse 反序列化

    【讨论】:

    • 我遇到了同样的问题。复杂对象只是集合中每个模型的一个属性的名称:值对的数组。
    • 感谢您的帮助!我没有意识到 toJSON 只返回一个准备好进行 JSON 字符串化的对象。
    【解决方案3】:

    我不想回答我自己的问题,但我在另一个问题中发现了问题: Saving Backbone model and collection to JSON string

    基本上,我没有意识到 toJSON() 只返回模型的属性。我的模型包含其他模型的集合,所以我需要覆盖 toJSON()。

    集合调用其子模型的 toJSON()。因此,我最终需要更改模型的 toJSON 函数以返回属性和它们包含的模型集合。

    示例如下:

    var Auction = Backbone.Model.extend({
      defaults: {
        auctionId : null
      },
      toJSON : function() {
        var returnObject = {};
        returnObject["auctionId"] = this.get("auctionId");
        returnObject["lots"] = this.lots;
        return returnObject;
      },
      initialize : function() {
        this.lots = new Lots;
      }
    });
    

    请注意,在我的示例中,我只是返回属性“auctionId”,而不是返回模型的所有属性。这对我来说似乎更安全,因为这里的另一个开发人员稍后可能会添加不需要传输的属性。话虽如此,让 returnObject 的元素包含所有属性可能是更好的做法。这只是让我在客户端重新构建模型变得更加容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 2019-09-28
      • 1970-01-01
      • 2018-01-15
      • 2011-09-20
      相关资源
      最近更新 更多