1

基本问题
我试图通过 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/jasonsrimpel/2011/11/backbone-js-and-socket-io

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

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

4

3 回答 3

1

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

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

socket.emit(e, object.toJSON());
于 2012-04-13T10:00:44.683 回答
1

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

于 2012-04-14T06:18:32.540 回答
0

我讨厌回答自己的问题,但我在另一个问题中发现了问题: 将主干模型和集合保存到 JSON 字符串

本质上,我没有意识到 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 的元素包含所有属性可能是更好的做法。这只是让我在客户端重新构建模型变得更加容易。

于 2012-04-16T15:19:06.123 回答