Универсальная модель в дереве состояний Mobx?

У меня будет несколько «продуктов» с разными «характеристиками».

Примеры

Продукты

  • Камеры
  • Ноутбук

Характеристики камеры

  • Цифровая камера мегапикселей
  • Марка
  • Оптический зум

Ноутбук Sepcs

  • Марка
  • Размер Ram
  • Операционная система
  • Количество ядер процессора
  • Размер дисплея
  • Размер жесткого диска

У меня будет 2 компонента

  1. Компонент фильтра
  2. результаты поиска

Компонент фильтра будет списком всех доступных фильтров для этого продукта.

Результаты поиска - это результаты, которые возвращаются, когда пользователь фильтрует результаты и показывает им некоторые характеристики каждого найденного продукта.

Я использую дерево состояний Mbox и понятия не имею, как хранить «продукты», которые возвращаются с сервера, поскольку каждый продукт будет иметь разные свойства.

Я мог бы предположить, может быть, сделать модель для каждого типа

  .model({
    id: types.identifierNumber,
    Brand: types.string,
    OpticalZoom: types.string,
    MegaPixels: types.string,
  })

  .model({
    id: types.identifierNumber,
    Brand: types.string,
    RamSize: types.string,
    Os: types.string,
    Cores: types.string,
    Display: types.string,
   HarddriveSize: types.string,
  })

но теперь я бы не знал, как получить доступ к двум разным моделям в моих компонентах, поскольку они будут привязаны к этим моделям.

Я мог бы сделать 1 огромную модель, но я не без ума от этой идеи, так как многие свойства не будут использоваться.

Еще одна вещь, которую я должен учитывать, - это то, что пользователь может затем щелкнуть один из результатов, который перейдет на другую страницу и покажет все подробности. Я бы, вероятно, использовал ссылку MST, чтобы получить к ней доступ, чего я не смог бы сделать, если бы сделал все отдельные модели.

Любые предложения, мне кажется, мне нужно больше json или чего-то более динамичного, поэтому я не уверен, является ли MST правильным решением для этого, но я не эксперт в этом, поэтому я хочу посмотреть, можно ли его использовать.


person chobo2    schedule 06.09.2018    source источник
comment
вы можете проверить о types.union. Пример: продукты: types.array (types.union (CameraModel, LaptopModel))   -  person maphongba008    schedule 12.09.2018
comment
хм интересно, я думаю, мне пришлось бы сделать много проверок, чтобы увидеть, с каким типом я имею дело. Другой способ, которым я думал это сделать, - это массив спецификаций, и одно поле будет иметь имя свойства, а другое - значение, но я еще не очень хорошо об этом подумал. Придется сравнить, какой вариант лучше.   -  person chobo2    schedule 13.09.2018


Ответы (1)


используйте 1_. ключ типа категории (или типа) для каждого типа. Затем используйте представления, чтобы получить определенный тип.

const Camera = model({
  type: literal('camera')
});
const Laptop = model({
  type: literal('laptop')
});

const Data = model({
  products = array(union(Camera, Laptop))
})
.views( self => ({
  get cameras() {
    return self.products.filter( p => p.type === 'camera');
  },
  get laptops() {
    return self.products.filter( p => p.type === 'laptop');
  }
}))
person Eduard Jacko    schedule 25.11.2018