Mobx没有观察到可观察数组中的类

时间:2017-11-10 16:58:30

标签: javascript reactjs mobx

如果我将一个类实例推送到MobX中的一个可观察数组中,则不会被观察到。但是,如果我将一个文字对象推入一个可观察的数组,那么就会被观察到。

docs for observable arrays

  

"数组的所有(未来)值也将是可观察的"

所以我试图理解为什么会这样。

例如,可以在节点中运行以下代码:

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属性可观察,但我想知道为什么我需要这样做。

1 个答案:

答案 0 :(得分:4)

永远不会自动转换,以免干扰类本身可能具有的任何内部假设。请参阅observable objects的文档:-D

  

如果value是具有原型,JavaScript原语或函数的对象,则将返回Boxed Observable。 MobX不会自动生成具有原型的对象;因为这是其构造函数的责任。在构造函数中使用extendObservable,或者在类定义中使用@observable。

换句话说,做一些事情:

class Todo { constructor(title) { extendObservable(this, { title }) } }