2

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を使用し、自動実行からログを削除すると、問題のサイクルが壊れました。

4

1 に答える 1

7

実際のコードなしでこの質問に答えるのは少し難しいです。コードを共有できますか?ただし、MobX は、少し考え方を変えると最も効果的に機能することに注意してください。「X が発生した場合、Y を変更する必要があります」と強制的に言うのではなく、「Y は X から派生させることができる」と言う方が適切です。これらの線に沿って考えると、MobX は本当に輝き始めるでしょう。

したがって、2 つの観測可能なモデルを用意する代わりに、そのうちの 1 つをもう 1 つの派生モデルにする必要があると思います (Computed Indeed を使用して)。それは理にかなっていますか?それ以外の場合は、質問についてもう少し詳しく説明してください:)

編集:

コードをありがとう。ループを回避するには、ログ ステートメントを削除する必要があります。現在、状態モデルをログに記録しているため、変更されるたびに自動実行が実行され、最初の項目が追加され (再び!)、stateModel が変更されます...

第二に、状態リストが観察可能であるべきかどうかはわかりませんが、少なくともその内容は観察可能であってはなりません (これはスナップショットであり、状態ごとのデータは変更されるべきではないため)。これを表現するために、asFlat修飾子を使用できます。これは、states コレクションが浅い観測のみ可能であることを示します@observable states = asFlat([])

それはあなたの質問に答えていますか?

于 2016-04-29T09:50:59.327 に答える