私はそこにあるさまざまなMV*フレームワークのパターンを調査してきましたが、今日、いくつかの問題を引き起こしているように見える奇妙なものに気づきました。
モデルのプロトタイプ。プロパティがありますcollections: []
コレクションのプロトタイプ。プロパティがありますmodels: []
コレクションが新しいモデルを取得すると、そのモデルはプッシュされますcollection.models
が、モデル自体も、そのメンバーであるコレクションを認識するように装飾されています。つまり、コレクションインスタンスがにプッシュされmodel.collections
ます。
コレクションプロパティを持つモデルであるbeingを含むコレクションも同様です...などmodel.collections[0]
。 .models[0]
最も基本的なもの:
var A = function() {
this.collections = [];
},
B = function() {
this.models = [];
this.add = function(what) {
what.collections.push(this);
this.models.push(what)
};
};
var model = new A();
var collection = new B();
collection.add(model);
有罪判決を受けた当事者は次のとおりです:https ://github.com/lyonbros/composer.js/blob/master/composer.js#L310-313そしてさらに下にあるモデルにプッシュしています:https ://github.com/ lyonbros / composer.js / blob / master / comboser.js#L781-784
ある程度の遅延評価があると思います。必要になるまで使用されません。そのコードは、それ自体で機能します。
しかし、私はbuster.jsを介してテストを作成していて、依存しているすべてのテストが(FF)または(Chrome)sinon.spy()
を生成していることに気付きました。キャプチャされたFFは、応答せずにクラッシュしていました。これは、バスターテストドライバーでこれまで遭遇したことはありません。昼休みに3.5GBのRAMを使用することさえありました。InternalError: too much recursion
RangeError: Maximum call stack size exceeded
かなりの量のデバッグを行った後、参照ストレージを元に戻しましたが、突然、すべて正常に動作しました。確かに、spy()
アサーションの削除も機能しましたが、それは重要ではありません。
だから、問題は-そのようなコードを持っていることは、それが受け入れられるか、ブラウザがそれをどのように解釈するか、ボトルネックは何ですか、そしてモデルが属するコレクション(おそらくコレクションコントローラとコレクションuid)へのポインタでモデルをどのように装飾するかですか何か)。
失敗するbuster.jsテストの完全な要点:https ://gist.github.com/2960549