ExtJS - Как использовать прокси, модель? Как они связаны? - PullRequest
15 голосов
/ 13 сентября 2011

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

Мое понимание

  1. Модели используются для представления объектов домена.
  2. Модели могут быть созданы ModelManager или просто с помощью конструктора
  3. Модели сохраняются в магазинах
  4. Хранилища могут находиться в хранилищах памяти или в хранилищах серверов. Это настраивается с помощью прокси.
  5. Прокси сообщает хранилищу, как общаться с резервным хранилищем - будь то массив JSON, или ресурс REST, или просто настроенный URL-адрес через ajax.
  6. Магазины отвечают за хранение моделей, а Прокси отвечают за контроль / помощь в выполнении этой задачи.
  7. При изменении значений модели устанавливается флаг dirty. Он автоматически очищается при сохранении модели. (подробнее об этом позже)

Часть, которая меня смущает

  1. Почему на модели есть proxy config и save метод? Я понимаю, что модели можно хранить только в магазинах.
  2. Почему флаг dirty не сбрасывается просто, когда я добавляю объект модели в магазин?
  3. Когда я добавляю объект модели в магазин, почему модель не получает прокси, настроенный для этого магазина?
  4. proxy - статическая конфигурация для модели. Означает ли это, что мы не можем использовать объекты конкретной модели с несколькими источниками данных? По сути, означает ли это, что несколько магазинов для одной модели практически бесполезны?
  5. Когда мы определяем магазин, мы определяем класс (тип магазина, если мы можем так его назвать), или это экземпляр магазина? Причина, по которой я спрашиваю: когда мы объявляем сетку, мы просто передаем ей конфигурацию магазина как store: 'MyApp.store.MyStore' - сетка создает сетку такого типа , или она просто использует хранилище, которое мы уже создали

Спасибо!

PS: +50 к награде человеку, который все это объясняет :) - предложит щедрость после того, как эти 48 часов закончатся.

Ответы [ 3 ]

19 голосов
/ 14 сентября 2011

Документы говорят:

Модель представляет некоторый объект, которым управляет ваше приложение.

Хранилище - это просто набор экземпляров модели - обычно загружаетсяс сервера где-то.


Модели сохраняются в магазинах

Не только.Модели можно использовать отдельно (например, для заполнения форм данными. Для получения дополнительной информации см. Ext.form.Panel.loadRecord ).

Почему существует конфигурация прокси исохранить метод на модели?Я понимаю, что модели можно хранить только в магазинах.

Как я уже сказал, не только.

Почему грязный флаг не очищается просто, когда я добавляюмодельный объект в магазине?

Зачем это нужно?Запись становится чистой только тогда, когда она синхронизируется с соответствующей записью на стороне сервера.

Когда я добавляю объект модели в хранилище, почему модель не получает прокси, настроенный для этого хранилища?

Это опять-таки, потому что модель может использоваться без хранилища.

прокси является статической конфигурацией для Модели.Означает ли это, что мы не можем использовать объекты конкретной модели с несколькими источниками данных?

Мы не можем использовать объекты конкретной модели, но мы можем использовать одно определение модели для нескольких хранилищ.Например:

Ext.define('MyModel', {
  // ... config
});
var store1 = Ext.create('Ext.data.Store', {
  model: 'MyModel',
  // ... config
  proxy: {
    // ...
    // this proxy will be used when store1.sync() and store1.load() are called
  }
  // ...
});
// ...
var storeN = Ext.create('Ext.data.Store', {
  model: 'MyModel',
  // ... config
  proxy: {
    // ...
    // this proxy will be used when storeN.sync() and storeN.load() are called
  }
  // ...
});

Поскольку store1 и storeN используют разные прокси, записи, содержащиеся в этих хранилищах, могут быть совершенно разными.

Когда мы определяем Store, мыопределение класса (тип магазина, если мы можем так его назвать) или это экземпляр магазина?

Да, когда мы определяем магазин, мы определяем класс.

Причина, по которой я спрашиваю: когда мы объявляем сетку, мы просто передаем ей конфигурацию магазина как хранилище: «MyApp.store.MyStore» - создает ли сетка экземпляр сетки этого типа или просто используетмагазин, который мы уже создали?

Существует несколько способов настройки конфигурации магазина для сетки:

  1. store: existingStore,
  2. store: 'someStoresId',
  3. store: 'MyApp.store.MyStore',

В первом и втором случаях будут использоваться существующие экземпляры магазинов.В третьем случае будет использоваться только что созданный экземпляр 'MyApp.store.MyStore'.Итак, store: 'MyApp.store.MyStore', равно

  var myStore = Ext.create('MyApp.store.MyStore', {});
  // ... 
    // the following - is in a grid's config:
    store: myStore,

ОБНОВЛЕНИЕ


Когда модель добавляется в магазин, а затем в магазинвызывается sync (), почему флаг очистки модели не очищен?

Он должен быть очищен, если ответ читателя, записывающего устройства и сервера не настроен должным образом.Посмотрите пример писателя .При синхронизации магазина автоматически удаляется грязный флаг.


Если класс модели вообще не имеет прокси-сервера, почему он отслеживает свой грязный статус?

Чтобы сообщить вам, изменилась ли запись с момента создания.


Что достигается введением концепции синхронизации моделей с сервером?

Предположим, вы создаете виджет, который содержит простой набор входных данных.Значения для этих входов могут быть загружены из дБ (этот набор входов представляет одну строку в таблице дБ).И когда пользователь изменяет значения входных данных, данные должны быть отправлены на сервер.Эти данные могут быть сохранены в одной записи.

Так что бы вы использовали для этого интерфейса: одну запись или хранилище с одной записью?

Автономная модель - для виджетов, которые представляют одну строку в таблице базы данных.
Store - для виджетов, представляющих набор строк в таблице базы данных.

1 голос
/ 04 мая 2012

Я перехожу с ExtJS 2.2 [sic] на 4, и поведение и терминология модели тоже заставили меня задуматься.

Лучшее быстрое объяснение, которое я могу найти, взято из этого поста в серии "Обратный отсчет до ExtJS 4" в блоге Сенчи. Оказывается Модель действует так же, как и она, потому что это «действительно» Запись.

Центральным элементом пакета данных является Ext.data.Model. Модель представляет некоторый тип данных в приложении - например, Приложение электронной коммерции может иметь модели для пользователей, продуктов и заказов. В Самая простая модель - это просто набор полей и их данных. Кто-нибудь знаком с Ext JS 3 будет использовать Ext.data.Record, который был предшественник Ext.data.Model.

Вот запутанная часть: Модель - это и модель для данных, которые вы используете и один экземпляр объекта, следующего за этой моделью. Давайте назовем два его использования: «Модель qua модель» и «Модель qua Запись».

Вот почему его load метод требует уникальный идентификатор (полная остановка). Модель qua Record использует этот идентификатор для создания RESTful URL-адресов для извлечения (и сохранения и т. Д.) одной записи стоимостью данных. Условное обозначение RESTful URL описано здесь и связано с этой записью в блоге Сенчи, в котором конкретно говорится об использовании модели.

Вот несколько URL-адресов RESTful, созданных по этому стандарту для ознакомления с форматом, который, по-видимому, использует модель ExtJS:

Работа с записью с идентификатором 1

GET /people/1 <<< That's what's used to retrieve a single record into Model

вернуть первую запись с идентификатором 2

DELETE /people/2

уничтожить первую запись с идентификатором 7

POST /people/7?_method=DELETE

и т. Д.

По этой же причине у моделей есть свои собственные прокси, чтобы они могли запускать операции RESTful через этот URL-адрес, измененный в соответствии с соглашениями, описанными в этой ссылке . Вы можете извлечь сотни записей из одного URL-адреса, который вы будете использовать в качестве источника прокси-сервера вашего Магазина, но когда вы хотите сохранить то, что находится в единой модели (снова подумайте «Модель qua Запись» здесь) Вы можете выполнять эти специфичные для записи операции через другой URL-адрес, бэкэнд которого перебивает одну запись за раз.


Так когда я пользуюсь магазинами?

Чтобы сохранить более одного экземпляра этой Модели, вы должны положить их в Магазин. Вы добавляете много моделей qua записей в хранилища и затем получаете доступ к этим "моделям" для извлечения данных. Поэтому, если у вас есть сетка, вы, естественно, захотите хранить все эти данные локально, без необходимости повторного запроса к серверу для отображения каждой строки.

Из первого поста :

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

И, конечно, магазины, по-видимому, извлекают информацию из модели qua модели, чтобы узнать, что они несут.

0 голосов
/ 01 августа 2014

Я нашел это в документации Sencha App Architecture Часть 2

Используйте прокси для моделей:

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

Использовать прокси для магазинов:

В Ext JS 4 несколько хранилищ могут использовать одну и ту же модель данных, даже если магазины будут загружать свои данные из разных источников. В нашем примере модель станции будет использоваться SearchResults и станциями хранить обе загрузки данных из другого места. Один возвращается результаты поиска, другой возвращает любимые станции пользователя. к Для этого одному из наших магазинов потребуется переопределить прокси определено на модели.

...