在我的应用程序中,我在另一个内编写了一个咖啡脚本类(一个实例class A包括一组对象,这些对象的实例class B作为它们的属性之一)。然后我发现了cmather 关于 EJSON 的视频,并认为将它与我的对象一起使用会很酷。但是,Meteor 似乎无法正确处理其他 EJSON 对象中的 EJSON 对象 -class A可以将其保存到数据存储中,并且在查询时以 a 的形式返回class A,但class B最终从集合中以 aObject而不是 a 的形式返回class B实例。当我运行一些测试代码时,嵌入的 EJSON 对象起初似乎可以工作(在 initial 之后collection.insert()),但它返回了普通的Objects 甚至刷新浏览器后结构不正确的对象。我的理论是 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")})