【发布时间】:2013-08-04 13:47:13
【问题描述】:
在我的应用程序中,我在另一个类中编写了一个 coffeescript 类(class A 的实例包括一组对象,这些对象具有 class B 的实例作为它们的属性之一)。然后我发现了cmather's video about EJSON,并认为将它与我的对象一起使用会很酷。但是,Meteor 似乎无法正确处理其他 EJSON 对象中的 EJSON 对象 - class A 可以保存到数据存储中,并且在查询时返回为 class A,但 class B 最终会出现从集合中作为Object 而不是class B 实例返回。当我运行一些测试代码时,嵌入的 EJSON 对象起初似乎可以工作(在最初的 collection.insert() 之后),但在刷新浏览器后它返回了普通的 Objects 甚至是结构不正确的对象。我的理论是 minimongo 和服务器端 mongo 的行为有些不匹配,但可能还有其他原因。
那么,有没有办法将一个 EJSON 对象嵌入到另一个对象中?也许我的代码有缺陷?这只是一个坏主意吗?我可以让class A 在其constructor 中实例化class B 项目本身,但似乎EJSON 应该能够处理这个问题。如果你认为这是一个错误,我很乐意在 github 上提交一个问题,但我想我会先在这里检查。
如果你需要代码来试试这个,你可以试试下面的代码,它设置了两个基本相同的类,一个叫做Inner,一个叫做Outer,并创建一个名为Outer的实例outer 包含 Inner 的实例作为属性 innerHere。在控制台中,键入testCollection.insert({outerHere: outer}。现在,testCollection.findOne() 可能会为您提供一个对象,其中该对象的innerHere 属性是Inner 的正确实例,但是如果您刷新浏览器,相同的命令可能会返回不同的内容。
如果这个问题难以理解,请告诉我,我会尽力澄清。
设置代码(只需在新项目的根目录中创建一个.coffee 文件):
@testCollection = new Meteor.Collection("test")
class @Outer
constructor: (value) ->
@value = value
clone: ->
new Outer(@value)
equals: (other) ->
_.isEqual(@, other)
typeName: ->
"Outer"
toJSONValue: ->
value: @value
EJSON.addType("Outer", (value)->
new Outer(value)
)
class @Inner
constructor: (value) ->
@value = value
clone: ->
new Inner(@value)
equals: (other) ->
_.isEqual(@, other)
typeName: ->
"Inner"
toJSONValue: ->
value: @value
EJSON.addType("Inner", (value)->
new Inner(value)
)
@outer = new Outer({innerHere: new Inner ("inner value")})
【问题讨论】:
-
我已经发布了一个拉取请求来大大简化这段时间:github.com/meteor/meteor/pull/1734
标签: meteor