2016-10-14 6 views
0

Я ищу наилучшее решение, как реализовать @observable в структуре дерева json-объектов (например, дерево), может быть очень глубоким. и каждый узел имеет много свойств, но мне нужно наблюдать только одно свойство в узле дерева. Просто если я сделаюMobx наблюдаемый глубокий объект

@observable questionnaire = {} 

это работает, но я думаю, что талия. Мне нужно наблюдать только свойство «selected». Вот структура 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 
       }, 
       ... 
      ] 
      }, ... 

ответ

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); 
    } 
} 

Затем вы создаете Node объект из верхнего уровня JSon объекта: new Node(json).

Это решение будет замечать только selected и childNodes. Это не идеально, потому что вам нужно обернуть свой объект json в объекты Node. Но я не могу придумать другого способа сделать это.

+0

Как вы думаете, если мы начнем наблюдать childNodes, тогда все свойства этого узла станут наблюдаемыми? –

+0

Вы в точности правы. Чтобы предотвратить это, нам нужно использовать модификатор 'asFlat'. Я обновил свой ответ. –

+0

Mouad Debbar Спасибо за ваш ответ. Я принимаю ваш ответ как решение моей проблемы с минимальной модификацией вашего кода. Я не думаю, что мне нужна эта строка вообще @observable childNodes = asFlat ([]); Свойство «selected» будет наблюдаться каждый раз, когда я «новый узел (дочерний элемент)». Еще раз спасибо за вашу помощь. :-) –