如果我将一个类实例推送到MobX中的一个可观察数组中,则不会被观察到。但是,如果我将一个文字对象推入一个可观察的数组,那么就会被观察到。
"数组的所有(未来)值也将是可观察的"
所以我试图理解为什么会这样。
例如,可以在节点中运行以下代码:
let mobx = require('mobx');
class TodoStore {
constructor() {
this.todos = mobx.observable.array([]);
this.todos.push({title:'todo 1'});
this.todos.push(new Todo('todo 2'));
}
}
class Todo {
constructor(title) {
this.title = title;
}
}
let store = new TodoStore();
console.log('***initial state***');
mobx.autorun(() => {
if(store.todos.length > 0) {
console.log('first todo:', store.todos[0].title);
console.log('second todo:', store.todos[1].title);
}
});
console.log('***Updating todo 1***');
store.todos[0].title = 'todo 1 updated';
console.log('***Updating todo 2***');
//Why doesn't this trigger the autorun?
store.todos[1].title = 'todo 2 updated';
注销
***initial state***
first todo: todo 1
second todo: todo 2
***Updating todo 1***
first todo: todo 1 updated
second todo: todo 2
***Updating todo 2***
更新todo[1]
不会触发自动运行。有谁能解释为什么?我知道我可以手动使Todo类的title
属性可观察,但我想知道为什么我需要这样做。
答案 0 :(得分:4)
类永远不会自动转换,以免干扰类本身可能具有的任何内部假设。请参阅observable objects的文档:-D
如果value是具有原型,JavaScript原语或函数的对象,则将返回Boxed Observable。 MobX不会自动生成具有原型的对象;因为这是其构造函数的责任。在构造函数中使用extendObservable,或者在类定义中使用@observable。
换句话说,做一些事情:
class Todo {
constructor(title) {
extendObservable(this, { title })
}
}