2013-09-11 2 views
0

Я смущен тем, как правильно использовать Модели/Магазины/Прокси/Читатели в ExtJS 4. Я прочитал руководства и посмотрел примеры, но до сих пор не вижу решение моей проблемы.ExtJS: Confused о пакете модели

Цель: Say Я работаю с car объектов (для которых модель существует), которые содержат (среди прочего):

  • идентификаторами автомобиля (VIN #, марка, модель, год, цвет , т.д.)
  • История собственности
  • История Техническое обслуживание
  • Подробный список компонентов автомобиля (двигателя: {L-Twin цилиндр, 2 клапана на цилиндр Desmodromic, с воздушным охлаждением}, передний тормоз: {}, ...)

И предположим, я использую VIN # как primairy ключ, и что у меня есть установка RESTfull API как

GET /car     // gets list of cars 
GET /car/123abc   // gets car with VIN# 123abc 

Теперь, если у меня есть ссылка на VIN # в контроллере, что я хочу сделать, это запустить сложной приборной панели, которые могут иметь такие компоненты, как:

  • сетка для компонентов автомобиля
  • график расходов на техническое обслуживание в зависимости от времени
  • Пользовательская панель для отображения марка, модель, год
  • ЭСТ

Проблема: Скажем, у меня есть Car модель и CarComponent модель, в которой настроен мой сервер для отправки вложенных данных (т.е. нет API для прямого взаимодействия с CarComponent 's). В идеале ... Я просто хочу запросить данные автомобиля с сервера с помощью простого GET /car/<the vin #> и использовать возвращаемые данные для заполнения всех компонентов комплексной панели. Так что моя стратегия попытки:

  • Модель: Car, CarComponent
  • Магазины: Cars
  • Доверенные: один остальные прокси прикреплен к Car модели
  • какого-то образом использовать вложенные свойства Car для заполнения компоненты (например, сетка компонентов)

Или мне нужны отдельные магазины для компонентов? Кроме того, я не могу сказать, как работают магазины; I не хочу загрузить все автомобили с сервера .. только указанный. Я просто смущен тем, как объединить модели/прокси/магазины, чтобы выполнить то, что мне нужно ...

ответ

1

В такой ситуации, когда у вас есть отдельная сетка для автомобилей и отдельная сетка для компонентов , идеальной настройкой было бы иметь API для работы с CarComponent. Поскольку вы упомянули об этом, это не так, я бы рекомендовал определить два отдельных магазина. Они будут выдавать один и тот же запрос GET для загрузки данных, но вы укажете разные root readers.Если сервер возвращает данные, похожие на:

{ 
    Car: 
    { 
     color:blue, 
     CarComponent: 
     { 
      engine: {..} 
     } 
     .. 
    } 
} 

затем один магазин (давайте назовем его CarStore) будет иметь корень Car читателя, а другой (назовем его CarComponentStore) Car.CarComponent. Недостатком этого подхода является то, что вам придется каждый раз вызывать два запроса: один для Car и другой для CarComponent, хотя возвращаемые данные будут одинаковыми. Однако этого можно избежать, используя концепцию «master» и «slave» store, см. Этот excellent answer, который объясняет это.

В сетке автомобилей вам необходимо установить магазин в CarStore, в CarComponent, в CarComponentStore. Правильно определяя корни читателей, обе сетки будут «автоматически» заполняться соответствующими данными из ответа.

Я не хочу, чтобы загрузить все автомобили с сервера ..

Ну, вы не должны, если вы не имеете понятия о VIN #. У большинства AP есть поддержка разбивки на страницы, так что вы можете загружать автомобили 10 на 10, например, или вы можете включить remote filtering для фильтрации записей на стороне сервера. Но первым предварительным условием является знать, какой автомобиль вы хотите получить :-)

+0

Хорошая идея для человека. Я пошел с тем, что вы сказали, с двумя отдельными магазинами - но вместо того, чтобы делать 2 запроса, я делаю 1 запрос на автомобиль, чтобы загрузить автомобиль, затем вручную заполнить компонентный магазин – Colin

+0

@Colin. Добро пожаловать! –

+0

@Colin Я добавил, как использовать только один запрос для заполнения обоих магазинов, концепцию, которую вы уже успешно применили :) –