在我的應用程序中,我在另一個(另一個實例class A
包含一個具有class B
實例作爲其屬性之一的對象的數組)中組成了一個coffeescript類。然後我發現了cmather's video about EJSON,並認爲將它與我的物體一起使用會很酷。但是,Meteor似乎並未正確處理其他EJSON對象內部的EJSON對象 - class A
可以保存到數據存儲中,並在查詢時返回爲class A
,但class B
最終會從該集合返回,作爲Object
而不是class B
實例。當我運行一些測試代碼時,嵌入式EJSON對象似乎首先工作(在初始collection.insert()
之後),但是在刷新瀏覽器之後,它返回了簡單的Object
或者結構錯誤的對象。我的理論是,minimongo和服務器端mongo的行爲有一些不匹配,但可能還有其他原因。我可以在另一個EJSON對象中嵌入一個EJSON對象嗎?
那麼,有沒有辦法將一個EJSON對象嵌入另一個?也許我的代碼存在缺陷?這只是一個壞主意嗎?我可以讓class A
在其constructor
中實例化class B
項目本身,但似乎EJSON應該能夠處理這個問題。如果您認爲這是一個錯誤,我會很樂意在github上提交問題,但是我認爲我會先在這裏檢查。
如果您需要的代碼嘗試了這一點,你可以試試下面的代碼,其中設置了兩個基本相同的類,一個叫Inner
,和一個叫Outer
,並創建一個包含一個實例調用outer
的Outer
實例作爲財產innerHere
的Inner
。在控制檯中輸入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")})
我已經發布了一個拉請求,以大大簡化這件事情的時間:https://github.com/meteor/meteor/pull/1734 –