【问题标题】:Mobx observable deep objectMobx 可观察深度对象
【发布时间】:2016-10-14 03:34:34
【问题描述】:

我正在寻找如何在深度 json 对象结构(例如树)数据树上实现 @observable 的最佳解决方案,这可能会非常深入。每个节点都有很多属性,但我只需要观察树节点中的一个属性。只要我这样做

@observable questionnaire = {}

它有效,但我认为那是腰部。我只需要观察“选定”属性。 这是json结构。如果我错了,请纠正我这里是简化的问卷对象。

[
  {
    "id": "1",
    "title": "level 1",
    "description": "text",
    "type": "Question",
    "selected": false,
    "childNodes": [
      {
        "title": "level 2",
        "description": "text",
        "type": "Question",
        "selected": false,
        "childNodes": [
          {
            "title": "level 3",
            "description": null,
            "type": "Question",
            "selected": false,
            "childNodes": [
              {
                "title": "level 4 1",
                "childNodes": [],
                "description": null,
                "type": "Checkbox",
                "selected": false
              },
              {
                "title": "level 4 2",
                "childNodes": [],
                "description": null,
                "type": "Checkbox",
                "selected": false
              },
              {
                "title": "level 4 3",
                "childNodes": [],
                "description": null,
                "type": "Checkbox",
                "selected": false
              },
              ...
            ]
          }, ...

【问题讨论】:

    标签: javascript json mobx


    【解决方案1】:

    一种方法是按如下方式实现Node 类:

    class Node {
      @observable selected = false;
      @observable childNodes = asFlat([]);
    
      constructor(data) {
        // Recursively create `Node` objects for all children.
        data.childNodes = data.childNodes.map(child => new Node(child));
        Object.assign(this, data);
      }
    }
    

    然后你从你的顶级 json 对象创建一个Node 对象:new Node(json)

    此解决方案将仅观察selectedchildNodes。这并不理想,因为您需要将 json 对象包装在 Node 对象中。但我想不出任何其他方法。

    【讨论】:

    • 你认为如果我们开始观察 childNodes 那么该节点中的所有属性都会变得可观察吗?
    • 你完全正确。我们需要使用asFlat 修饰符来防止这种情况。我更新了我的答案。
    • Mouad Debbar 谢谢您的回答。我接受您的回答作为对我的问题的解决方案,只需对您的代码进行最少的修改。我认为我根本不需要这条线 @observable childNodes = asFlat([]);每次我 'new Node(child)' 时,'selected' 属性都会变得可观察。再次感谢您的帮助。 :-)
    • 很高兴我的回答对您有所帮助:)
    猜你喜欢
    • 1970-01-01
    • 2020-12-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多