Ich versuche Mobx die Autorun zu bekommen richtig zu arbeiten.Mobx Autorun in der Praxis
Mein Anwendungsfall ist ich ein Modell, das ich serialisiert mag (oder zu entwässern), wenn es geändert wird und diese Informationen an den Daten eines anderen Modells hinzufügen. Das bringt mir rudimentäre Zeitreisen von Modellstaaten. Beide sind Observable.
Edit: Idea in Modell Trennung ist, dass man Daten der App-Modell und andere sollen vollständig separate Bibliothek sein, die ich aus der App nutzen könnte. Ich muss regelmäßig die Änderungen in der App verfolgen, aber die Benutzeroberfläche für das Status-Tool auf derselben Seite anzeigen.
Nun Autorun scheint seine eigenen Schlüsse zu machen, was ich Tracking tatsächlich. Wenn ich die Modellinstanz in die Instanziierung des Modells verschoben habe, wurde Autorun nicht mehr aufgerufen, wenn Änderungen vorgenommen wurden. Wenn die Modellinstanz auf der obersten Modulebene erstellt wurde, funktionierte sie wie erwartet. Dies war, als ich nur eine Eigenschaft des Beobachtungsmodells änderte (dasjenige, das bei jedem Autorun-Aufruf geändert wird). Als ich im beobachtenden Modell versuchte, zwei Dinge auf einmal zu ändern, wurde nun auch Autorun für diese Änderungen aufgerufen, was zu einem endlosen Zyklus führte (den Mobx erwischte).
Ich möchte wissen, wie ich ausdrücken kann, was ich mit der Autorun-Funktion trackere, expliziter sein, oder ob es andere Möglichkeiten gibt, Modelländerungen zu verfolgen und andere Modelle zu aktualisieren, wenn etwas passiert.
Bearbeiten mit Codebeispiel.
Das ist, was ich tat (stark vereinfacht):
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";
Und das schafft zirkuläre Abhängigkeit, da Autorun für sowohl Änderung ursprünglichen Datenmodells und der daraus resultierenden Änderung Speicher aufgerufen wird, während ich nur daran interessiert bin in der Verfolgung von Änderungen an ersterem.
Bearbeiten mit Arbeitsergebnis:
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";
Wie pro @mweststrate Antwort, mit asFlat mit Store Staaten Variable und die Protokollierung von Autorun entfernt brach das Problem Zyklus.
Nach weiterem Lernen gelang es mir, das Autorun mit wenig Indirektion zu arbeiten. Laut Dokumentation ist Autorun für "reaktive Funktion, die niemals Beobachter selbst haben wird". Ich dachte, dass die Reaktion auf das Modell beschränkt ist, das ich beobachte, nicht alle Modelle in der gleichen App. Autorun erkennt sowohl mein Datenmodell als auch das Zustandsmodell und bemerkt Änderungen in beiden. Warum es in einigen Fällen funktioniert und nicht in anderen, ist etwas verwirrend. Ich muss mehr suchen, um den richtigen Weg für diesen Anwendungsfall zu finden. – jarpineh
Ich habe dieses Projekt gefunden: https://github.com/AriaFallah/mobx-store Ich benutze scheinbar Autorun auf falsche Weise hier. Ich habe versucht, "berechnet" und seine Beobachtungsmethode zu verwenden, aber das scheiterte noch schneller. Es scheint, dass ich meinen Ansatz überdenken muss. Above-Store-Implementierung verwendet Funktion beobachten direkt und sieht wirklich einfach aus (obwohl es verfolgen muss, wann Änderungen vorgenommen werden). – jarpineh