在我的应用程序中,我在另一个内编写了一个咖啡脚本类(一个实例class A
包括一组对象,这些对象的实例class B
作为它们的属性之一)。然后我发现了cmather 关于 EJSON 的视频,并认为将它与我的对象一起使用会很酷。但是,Meteor 似乎无法正确处理其他 EJSON 对象中的 EJSON 对象 -class A
可以将其保存到数据存储中,并且在查询时以 a 的形式返回class A
,但class B
最终从集合中以 aObject
而不是 a 的形式返回class B
实例。当我运行一些测试代码时,嵌入的 EJSON 对象起初似乎可以工作(在 initial 之后collection.insert()
),但它返回了普通的Object
s 甚至刷新浏览器后结构不正确的对象。我的理论是 minimongo 和服务器端 mongo 的行为存在一些不匹配,但可能还有其他原因。
那么,有没有办法将一个 EJSON 对象嵌入到另一个对象中?也许我的代码有缺陷?这只是一个坏主意吗?我本可以在它的 中class A
实例化class B
项目本身constructor
,但似乎 EJSON 应该能够处理这个问题。如果您认为这是一个错误,我很乐意在 github 上提交一个问题,但我想我会先在这里检查。
如果你需要代码来试试这个,你可以试试下面的代码,它设置了两个基本相同的类,一个是 called Inner
,一个是 called 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")})