mobx:如何观察嵌套对象的变化?
mobx: how to observe changes in nested objects?
我有两个模型:包含消息文本(可观察)的 MessageModel
和包含这些 MessageModel
对象列表(也可观察)的 MessageListModel
。
我在消息列表的每次更改上注册了一个 mobx.autorun()
。
但是,autorun
触发列表中的 adding/removing 条消息,但不会触发更改现有消息的文本。
示例:
我的MessageListModel
:
import { observable, decorate } from "mobx";
import MessageModel from "./MessageModel";
import * as mobx from "mobx";
class MessageListModel {
messages = [];
constructor() {
mobx.autorun(() => {
console.log('Autorun triggered!');
console.log(this.messages.length);
});
}
addMessage(text) {
this.messages.push(new MessageModel({ messageList: this, text: text }));
}
getMessageText(index) {
return this.messages[index].text;
}
setMessageText(index, messageText) {
this.messages[index].text = messageText;
}
}
decorate(MessageListModel, {
messages: observable, // don't wanna use decorator syntax
})
export default MessageListModel;
我的MessageModel
:
import { observable, computed, action, decorate } from "mobx";
import {observer} from "mobx-react";
class MessageModel {
constructor({messageList, text}) {
this.text = text;
this.messageList = messageList;
}
text = undefined;
}
decorate(MessageModel, {
text: observable,
})
export default MessageModel;
正在尝试 运行 这个:
const messageList = new MessageListModel();
messageList.addMessage('msg1'); // triggers autorun
messageList.addMessage('msg2'); // triggers autorun
messageList.setMessageText(1, 'other text'); // does not trigger autorun
messageList.setMessageText(0, 'other text'); // does not trigger autorun either
如何让它观察我消息的变化,而不是它们的数量?
在您的 autorun
方法中,您只是 侦听 消息数组 length
的变化,因此唯一被跟踪的是autorun
函数是数组的length
属性。
尝试将 autorun
更改为此以查看区别:
mobx.autorun(() => {
console.log('Autorun triggered!');
console.log(this.messages.length);
this.messages.map((model)=>{
console.log(model.text)
})
});
在上面的示例中,我们正在访问 model
上的 text
属性,因此无论何时您在任何模型上更改 text
,autorun
都会执行。
因此,autorun
仅当明确跟踪(在函数内部访问)的属性发生更改时才会 运行。
我有两个模型:包含消息文本(可观察)的 MessageModel
和包含这些 MessageModel
对象列表(也可观察)的 MessageListModel
。
我在消息列表的每次更改上注册了一个 mobx.autorun()
。
但是,autorun
触发列表中的 adding/removing 条消息,但不会触发更改现有消息的文本。
示例:
我的MessageListModel
:
import { observable, decorate } from "mobx";
import MessageModel from "./MessageModel";
import * as mobx from "mobx";
class MessageListModel {
messages = [];
constructor() {
mobx.autorun(() => {
console.log('Autorun triggered!');
console.log(this.messages.length);
});
}
addMessage(text) {
this.messages.push(new MessageModel({ messageList: this, text: text }));
}
getMessageText(index) {
return this.messages[index].text;
}
setMessageText(index, messageText) {
this.messages[index].text = messageText;
}
}
decorate(MessageListModel, {
messages: observable, // don't wanna use decorator syntax
})
export default MessageListModel;
我的MessageModel
:
import { observable, computed, action, decorate } from "mobx";
import {observer} from "mobx-react";
class MessageModel {
constructor({messageList, text}) {
this.text = text;
this.messageList = messageList;
}
text = undefined;
}
decorate(MessageModel, {
text: observable,
})
export default MessageModel;
正在尝试 运行 这个:
const messageList = new MessageListModel();
messageList.addMessage('msg1'); // triggers autorun
messageList.addMessage('msg2'); // triggers autorun
messageList.setMessageText(1, 'other text'); // does not trigger autorun
messageList.setMessageText(0, 'other text'); // does not trigger autorun either
如何让它观察我消息的变化,而不是它们的数量?
在您的 autorun
方法中,您只是 侦听 消息数组 length
的变化,因此唯一被跟踪的是autorun
函数是数组的length
属性。
尝试将 autorun
更改为此以查看区别:
mobx.autorun(() => {
console.log('Autorun triggered!');
console.log(this.messages.length);
this.messages.map((model)=>{
console.log(model.text)
})
});
在上面的示例中,我们正在访问 model
上的 text
属性,因此无论何时您在任何模型上更改 text
,autorun
都会执行。
因此,autorun
仅当明确跟踪(在函数内部访问)的属性发生更改时才会 运行。