mobx:如何观察嵌套对象的变化?

问题描述 投票:0回答:1

我有两个模型:MessageModel包含消息文本(可观察),MessageListModel包含这些MessageModel对象的列表(也可观察)。

我在每次更改邮件列表时都注册了一个mobx.autorun()

但是,autorun在列表中添加/删除消息时触发,但在更改现有消息的文本时不触发。

示例:

我的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


我如何使其观察到消息的变化,而不是消息量的变化?

mobx
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.