KnockoutJS を使用したページがあり、オブザーバブルの数がやや多くなっています (ここでは約 35 個、合計で約 60 個)。KO マッピング プラグインを使用していますが、それが問題に関係しているかどうかはわかりません。
オブザーバブルのほとんど (すべてではない) は、入力フィールドにバインドされています。
ユーザーは、現在の入力セットを名前付きセットに保存するか、以前に保存したセットから再読み込みできます。現在の入力セットが保存されたセットからのものか、編集された (保存されていない) 入力かを示す UI があります。
入力のいずれかが編集されたときに「保存/読み込み入力」UI を更新するために (どれを気にする必要はありません)、関連するすべての「入力」オブザーバブルをサブスクライブします。
これが私の奇妙な問題です。サブスクライブされたオブザーバブルの数が約 25 以上になると、呼び出しの奥深くからコールバック関数への偽の呼び出しが行われko.applyBindings(...)
ます。
- それが発生すると、スプリアス コールバックは 1 つだけです。
- 報告される入力は、通常、私が最後に購読したものです。
- 約 25 以下にサブスクライブするのに十分な数のサブスクリプションを削除すると、偽のコールバックは表示されなくなります。
- その制限を超えてサブスクリプションを追加し続けると、リストに追加し続けると、さまざまなフィールドに対して呼び出しが再表示されます。
__ko_mapping__
すべての入力を購読すると、コールバックはばかげたコールバックであると主張します。
サブスクリプションに正しくバインドしていないか、KO または KO マッピング プラグインにバグがあり、サブスクリプションのリストがめちゃくちゃになっていると想定する必要があります。これまで問題を追跡できませんでした。
サブスクリプション コードは、おおよそ次のようになります。
// markSavedInputsDirty(name) defined elsewhere
function registerCallbacks() {
var data = viewModel.inputs;
var member;
for(member in data) {
if (data.hasOwnProperty(member) && ko.isObservable(data[member])) {
if(member /* ... not certain observables which I need to ignore */ ) {
data[member].subscribe(function() {return markSavedInputsDirty(member)}, data[member]);
}
}
}
}
(注: 上記のコードは、どのメンバーが呼び出されているかを追跡しますが、デバッグ支援としてのみです。最初に問題が発生したのを見たとき、コードはすべてのオブザーバブルに対して同じコールバック関数 (カリー化なし) を使用していました)
誰もこのようなものを見たことがありますか?