Наблюдаемая частная собственность в Mobx - PullRequest
1 голос
/ 02 апреля 2020

У меня проблема с наблюдаемой частной собственностью в магазине Mobx. Дело в том, что наблюдаемое частное свойство с методами получения и установки не работает, в то время как общедоступное c наблюдаемое свойство прекрасно работает. Почему так? Я протестировал как личное, так и публичное c свойство (#privateSelectedType и selectedType), чтобы сделать одно и то же.

EDIT2 : я создал коды и поле, чтобы лучше показать case: https://codesandbox.io/s/tender-pond-kglzr?file= / src / carsStore. js

Вот код, который иллюстрирует ситуацию. Я использую это хранилище для отображения всех типов и отмечаю selectedType:

class CarsStore {
    #types = ["defaultType", "type1", "type2"];
    #privateSelectedType = "defaultType";
    selectedType = "defaultType";

    otherThings = [];

    get types(){
      return this.#types;
    }

    get privateSelectedType() {
      return this.#privateSelectedType;
    }
    set privateSelectedType(selectedType) {
      this.#privateSelectedType = selectedType;
      // call function updating otherThings, that's why I want to use setter in this store
      this.#updateOtherThings();
    }

    #updateOtherThings = () => {
      //update otherThings
    }
  }

  decorate(CarsStore, {
    "#types": observable,
    "#privateSelectedType": observable,
    selectedType: observable,
    otherThings: observable
  });

РЕДАКТИРОВАТЬ: Простое изменение всех вхождений #privateSelectedType на publi c поле _publicSelectedType делает этот код работающим. Мне кажется, что mobx просто не работает или работает по-другому с JavaScript закрытыми полями.

1 Ответ

1 голос
/ 04 апреля 2020

ИЗМЕНЕННЫЙ ОТВЕТ:

После некоторых исследований и отладки вашего кода в комментариях выясняется, что mobx внутренне пытается украсить свойства прототипа CarsStore, где закрытые поля являются отсутствует :

enter image description here

Причина этого заключается в том, что в этом предложении синтаксис частные поля видны и доступны только из тело класса , поскольку они записаны как метаданные и доступны только из движка. Больше информации в этой ссылке (пункт 5) . Я надеюсь, что это отвечает на ваш вопрос сейчас.

...