私のアプリでは、1 つの coffeescript クラスを別のクラス内に作成しました ( のインスタンスには、プロパティの 1 つとして のclass A
インスタンスを持つオブジェクトの配列が含まれていますclass B
)。その後、EJSON に関する cmather のビデオを発見し、それをオブジェクトで使用するのはクールだと思いました。ただし、Meteor は、他の EJSON オブジェクト内にある EJSON オブジェクトを正しく処理していないようです。class A
はデータストアに保存でき、照会すると として返されますclass A
がclass B
、コレクションからObject
ではなくとして返されます。class B
実例。collection.insert()
いくつかのテスト コードを実行したところ、埋め込まれたEJSON オブジェクトは最初は (最初の.Object
または、ブラウザを更新した後の構造が正しくないオブジェクト。私の理論では、minimongo とサーバー側の mongo の動作にはいくつかの不一致がありますが、他の原因がある可能性があります。
では、ある EJSON オブジェクトを別のオブジェクトに埋め込む方法はありますか? おそらく私のコードに欠陥がありますか?それはただの悪い考えですか?でアイテム自体をclass A
インスタンス化することもできましたが、EJSON がこれを処理できるはずです。これがバグだと思われる場合は、喜んで github に問題を送信しますが、最初にここで確認することにしました。class B
constructor
これを試すためのコードが必要な場合は、以下のコードを試すことができます。このコードは、2 つの本質的に同一のクラス (1 つは と呼ばれInner
、もう1 つは と呼ばれます) をセットアップし、 のインスタンスをプロパティとして含むと呼ばれる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")})