Mobx の自動実行を正しく機能させようとしています。
私のユースケースは、変更されたときにシリアル化 (または脱水) し、その情報を別のモデルのデータに追加するのが好きな 1 つのモデルがあることです。これにより、モデル状態の初歩的なタイムトラベルが可能になります。どちらも観測対象です。
編集:モデル分離のアイデアは、1つはアプリのデータモデルであり、もう1つはアプリから使用できる完全に分離されたライブラリである必要があるということです。アプリの変更を定期的に追跡する必要がありますが、同じページに状態ツールの UI を表示します。
現在、自動実行は、私が実際に追跡しているものを独自に推測しているようです。モデルのインスタンス化を監視する中でモデル インスタンスを移動すると、変更が発生したときに自動実行が呼び出されなくなりました。モジュールの最上位にモデルインスタンスを作成すると、思った通りに動きました。これは、観察モデルの 1 つのプロパティ (すべての自動実行呼び出しによって変更されるもの) のみを変更したときでした。観察モデルで一度に 2 つのことを変更しようとしたところ、自動実行がこれらの変更に対しても呼び出されるようになり、終わりのないサイクルにつながりました (これを Mobx がキャッチしました)。
自動実行機能で追跡しているものをより明示的に表現する方法、またはモデルの変更を追跡し、何かが発生したときに他のモデルを更新する他の方法があるかどうかを知りたいです。
コード例で編集します。
これは私がやったことです(非常に単純化されています):
class DataModel {
@observable one_state = null;
}
class StateStore {
@observable states = [];
}
let data = new DataModel();
let store = new StateStore();
autorun(() => {
store.states.push(data.one_state);
console.log("new data", toJSON(store.states));
});
data.one_state = "change 1";
data.one_state = "change 2";
また、元のデータ モデルの変更とその結果のストアの変更の両方に対して autorun が呼び出されるため、循環依存関係が作成されますが、前者への変更の追跡にのみ関心があります。
作業結果で編集:
class DataModel {
@observable one_state = null;
}
class StateStore {
@observable states = asFlat([]);
}
let data = new DataModel();
let store = new StateStore();
autorun(() => {
store.states.push(data.one_state);
});
data.one_state = "change 1";
data.one_state = "change 2";
@mweststrateの回答によると、ストアの状態変数でasFlatを使用し、自動実行からログを削除すると、問題のサイクルが壊れました。