MobX -重置所有存储可观察对象回到初始状态
MobX - Reset all store observables back to initial state?
给定MyQuestionStore
store:
class MyQuestionStore {
@observable asked = 'today';
@observable answered = false;
@observable question = {
upvotes: 0,
body: null,
asker: null,
askerPoints: null,
askerBadges: null
}
// some more initial state observables...
// some actions below...
}
const myQuestionStore = new MyQuestionStore();
export default myQuestionStore;
将所有存储的可观察对象重置回其初始状态数据('today'/false/0/null/等..)的正确方法是什么?
注:像MyQuestionStore.reset()
的东西,例如我认为将是一个很好的MobX方式,但我不认为它存在。我必须编写一个名为reset
的操作,并手动将每个可观察对象重置回其初始状态。我不认为这将是正确的方式,因为如果我添加更多的observables
,我将不得不手动将它们添加到reset
动作每次。
EDIT:这是一个旧的答案,在新版本的mobx中不起作用。
如果使用reset()
初始化对象,可以避免代码重复。我的意思是:
import { extendObservable } from "mobx";
class MyQuestionStore {
constructor() {
this.reset();
}
@action reset() {
extendObservable(this, {
asked: 'today',
answered: false,
question: {
upvotes: 0,
body: null,
asker: null,
askerPoints: null,
askerBadges: null
}
});
}
}
要重置存储,可以这样做:
const initialValue = {
name: 'John Doe',
age: 19,
}
@action reset() {
Object.keys(initialState).forEach(key => this[key] = initialState[key]);
}
您可以设置初始存储值:
class myStore {
constructor() {
extendObservable(this, initialState);
}
}
我最终不得不在重置函数中重复默认的可观察对象,所以它看起来像这样:
class MyQuestionStore {
@observable asked = 'today';
@observable answered = false;
@observable question = {
upvotes: 0,
body: null,
asker: null,
askerPoints: null,
askerBadges: null
}
@action reset = () => {
this.asked = 'today';
this.answered = false;
this.question = {
upvotes: 0,
body: null,
asker: null,
askerPoints: null,
askerBadges: null
}
}
}
const myQuestionStore = new MyQuestionStore();
export default myQuestionStore;
我仍然觉得有比重复和保持DRY更好的方法。我将把这个问题保留到现在,希望有一个更好的DRY答案。
如果您不需要深度重置,mobx-utils
中的createViewModel
实用程序可能会派上用场:https://github.com/mobxjs/mobx-utils/#createviewmodel
为什么不采用以下方法
class MyQuestionStore {
@observable asked;
@observable answered;
@observable question;
constructor() {
super()
this.init()
}
@action reset() {
this.init()
}
@action init() {
this.asked = 'today';
this.answered = false;
this.question = {
upvotes: 0,
body: null,
asker: null,
askerPoints: null,
askerBadges: null
}
}
// some more initial state observables...
// some actions below...
}
const myQuestionStore = new MyQuestionStore();
export default myQuestionStore;
相关文章:
- 将js对象更改为使用嵌套的可观察数组敲除js视图模型
- $scope$观察数组中的一个特定对象——Angular JS控制器
- 无法观察Ember.js中的对象数组
- 如何从具有动态可观察属性的淘汰对象中获取 JSON 字符串
- 培根.js Bus.plug: 未捕获 错误: 不是可观察的 : [对象对象]
- 使用rxjs创建一个可观察的对象,该对象稍后将连接到web套接字
- 将$scope对象作为参数提供给$digest中的观察者背后的逻辑
- Knockoutjs当父对象's可观察到的变化
- 在ko.applyBindings(..)中执行Knockout js订阅函数(用于可观察对象)
- 聚合物通过父对象观察子属性
- Knockoutjs观察嵌套对象并订阅更改
- Knockout.js用单个json对象绑定一个可观察对象
- 使用AngularJS观察整个对象(深度观察)
- 无限循环当观察父对象时,观察者不更新任何值
- 向KO传递在对象内可观察到的计算值
- 根据某些条件将 JS 绑定到可观察对象内的数组元素
- 如何从下拉列表中由可观察数组填充的选定项中检索完整对象
- 如何创建挖空可观察数组/对象的深层副本
- 对象.观察顺序
- 对象.观察同步回调