我正在尝试让Mobx的自动运行正常工作。
我的用例是,我有一个模型想要在更改时进行序列化(或脱水)并将该信息添加到另一个模型的数据中。这给我带来了模型状态的基本时间旅行。两者都是可观察的。
编辑:模型分离的想法是,一个是应用程序的数据模型,另一个应该是我可以从应用程序使用的完全独立的库。我需要定期跟踪应用程序中的更改,但在同一页面上显示状态工具的UI。
现在,自动运行似乎可以对我实际跟踪的内容做出自己的推断。当我在观察模型的实例内部移动模型实例时,发生更改时不再调用自动运行。当在模块顶层创建模型实例时,它按预期工作。这是我仅更改观察模型的一个属性(每次自动运行调用都会更改的属性)的时候。当我尝试在观察模型中一次更改两件事时,现在也要求自动运行来进行这些更改,从而导致无休止的循环(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";
这就产生了循环依赖关系,因为自动运行同时需要和原始数据模型更改以及由此产生的商店更改,而我只对跟踪前者的更改感兴趣。
编辑工作结果:
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与商店的状态变量一起使用并从自动运行中删除日志记录会破坏问题周期。
最佳答案
如果没有任何实际代码,很难回答这个问题。您可以共享一些代码吗?但是请注意,如果您稍作调整,MobX的效果最好:与其强制性地说“如果X发生,则应更改Y”,而最好说“Y可以从X派生”。如果您按照这些思路考虑,MobX将会真正开始发光。
因此,我认为不应该使用两个可观察的模型,而应使用其中一个(实际上是使用计算的)来推导另一个模型。那有意义吗?否则,请随时详细说明您的问题:)
编辑:
好的,谢谢您的代码。您应该删除log语句,以免循环。当前,您记录状态模型,因此每次更改时,都会运行自动运行,再次添加第一项(更改!),更改stateModel等。
其次,我不确定状态列表是否应可观察,但至少其内容应不可观察(因为它是快照,并且每个状态的数据均不应更改)。要表达这一点,可以使用asFlat
修饰符,该修饰符指示状态集合只能是浅层可观察的:@observable states = asFlat([])
。
这是否回答你的问题?
关于mobx - 实践中的Mobx Autorun,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36882298/