ExtJS - Как использовать прокси, модель? Как они связаны?
Я пытался научиться работать с моделями и магазинами. Но прокси-бит меня очень запутывает. Поэтому я собираюсь перечислить свое понимание здесь - просьба указать на пробелы в моем понимании.
Мое понимание
- Модели используются для представления объектов домена.
- Модели могут быть созданы ModelManager или просто с помощью конструктора
- Модели сохраняются в магазинах
- Магазины могут храниться в памяти или быть серверами. Это настроено с использованием прокси.
- Прокси сообщает магазину, как разговаривать с хранилищем резервных копий - будь то массив JSON или ресурс REST, или просто настроенный URL-адрес через ajax.
- Магазины несут ответственность за хранение моделей, и Proxies несут ответственность за контроль/помощь в выполнении этой задачи.
- При изменении значений модели флаг
dirty
устанавливается. Он автоматически очищается, когда модель сохраняется. (подробнее об этом позже)
Часть, которая меня смущает
- Почему существует метод
proxy
config и save
на модели? Я понимаю, что модели можно хранить только в магазинах.
- Почему флаг
dirty
не удаляется просто, когда я добавляю объект модели в хранилище?
- Когда я добавляю объект модели в хранилище, почему модель не получает прокси-сервер, настроенный с этим хранилищем?
-
proxy
- статическая конфигурация для модели. Означает ли это, что мы не можем использовать объекты конкретной модели с несколькими источниками данных? Посредством расширения, означает ли это, что наличие нескольких магазинов для одной модели практически бесполезно?
- Когда мы определяем хранилище, определяем ли мы класс (тип хранилища, если можно так назвать), или это экземпляр магазина? Причина, о которой я спрашиваю, когда мы объявляем сетку, мы просто передаем ей конфигурацию хранилища как
store: 'MyApp.store.MyStore'
- сетка создает сетку такого типа или просто использует уже созданный нами магазин?
Спасибо!
PS: +50 щедрость человеку, который объясняет все это:) - предложит награду после тех 48 часов.
Ответы
Ответ 1
Документы говорят:
Модель представляет собой некоторый объект, которым управляет ваше приложение.
A Store - это всего лишь коллекция экземпляров Model, обычно загружаемых с сервера где-то.
Модели сохраняются в магазинах
Не только. Модели можно использовать отдельно (f.i. для заполнения форм с данными. Ext.form.Panel.loadRecord для получения дополнительной информации).
Почему в модели есть прокси-конфигурация и метод сохранения? Я понимаю, что модели можно хранить только в магазинах.
Как я уже сказал, не только.
Почему грязный флаг не очищается просто, когда я добавляю объект модели в хранилище?
Почему? Запись становится чистой только тогда, когда она синхронизируется с соответствующей записью на стороне сервера.
Когда я добавляю объект модели в хранилище, почему модель не получает прокси-сервер, настроенный с этим хранилищем?
Это опять же, потому что модель может использоваться без сохранения.
proxy - статическая конфигурация для модели. Означает ли это, что мы не можем использовать объекты конкретной модели с несколькими источниками данных?
Мы не можем использовать объекты конкретной модели, но мы можем использовать одно определение модели для нескольких хранилищ. Например:
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" - сетка создает сетку такого типа или просто использует магазин, вы уже создали?
Существует несколько способов установить конфигурацию хранилища для сетки:
-
store: existingStore,
-
store: 'someStoresId',
-
store: 'MyApp.store.MyStore',
В первом и втором случаях будут использоваться существующие экземпляры магазинов. В третьем случае будет использоваться только что созданный экземпляр 'MyApp.store.MyStore'
. Итак, store: 'MyApp.store.MyStore',
равно
var myStore = Ext.create('MyApp.store.MyStore', {});
// ...
// the following - is in a grid config:
store: myStore,
UPDATE
Когда модель добавляется в хранилище, а затем вызывается функция store sync(), почему флаг грязной модели не очищается?
Он должен быть очищен, если отчет читателя, автора и сервера не настроен должным образом. Просмотрите пример автора. Существует грязный флаг, который автоматически очищается при синхронизации хранилища().
если класс модели вообще не имеет никакого прокси-сервера, почему он отслеживает свой грязный статус?
Чтобы узнать, была ли запись изменена с момента создания.
Что достигается путем введения концепции моделей, синхронизирующихся с сервером?
Предположим, вы создаете виджет, который содержит простой набор входов. Значения для этих входов могут быть загружены из db (этот набор входов представляет одну строку в таблице db). И когда пользователь меняет значения входных данных, данные должны быть отправлены на сервер. Эти данные могут быть сохранены в одной записи.
Итак, что бы вы использовали для этого интерфейса: одна запись или магазин с одной записью?
Автономная модель - для виджетов, которые представляют одну строку в таблице db.
Сохранить - для виджетов, которые представляют собой набор строк в таблице db.
Ответ 2
Я прихожу из ExtJS 2.2 [sic] в 4, и поведение модели и терминология бросают меня за цикл тоже.
Лучшее быстрое объяснение, которое я могу найти, это этот пост в серии "Обратный отсчет до ExtJS 4" в блоге Sencha. Выключается Модель действует так, как будто она действительно "Запись".
Центральным элементом пакета данных является Ext.data.Model. Модель представляет некоторый тип данных в приложении - например, Приложение электронной коммерции может иметь модели для пользователей, продуктов и заказов. В его простейшая Модель - это всего лишь набор полей и их данных. Кто угодно знакомый с Ext JS 3, будет использовать Ext.data.Record, который был предшественник Ext.data.Model.
Здесь запутанная часть: Модель - это как модель для данных, которые вы используете, так и один экземпляр объекта, следующий за этой моделью. Позвольте назвать его два использования "Модель qua model" и "Модель qua Record".
Вот почему для метода load
требуется уникальный идентификатор (полная остановка). Модель qua Record использует этот идентификатор для создания URL-адресов RESTful для извлечения (и сохранения и т.д.) Одной записи данных. Соглашение RESTful URL описано здесь и связано с этот пост в блоге Sencha, в котором конкретно говорится об использовании модели.
Вот несколько URL-адресов RESTful, сформированных для этого стандарта, чтобы ознакомиться с форматом, который, как представляется, ExtJS Model использует:
Работайте с записью с идентификатором 1
GET /people/1 <<< That what used to retrieve a single record into Model
возвращает первую запись с идентификатором 2
DELETE /people/2
уничтожить первую запись с идентификатором 7
POST /people/7?_method=DELETE
Etc и т.д.
Вот почему у моделей есть свои собственные прокси-серверы, так что они могут запускать операции RESTful через этот URL-адрес, модифицированный, чтобы следовать соглашениям описанным в этой ссылке. Вы можете вытащить 100 записей из одного URL-адреса, который вы использовали бы в качестве источника прокси-сервера Store, но если вы хотите сохранить то, что в одной модели (опять же, подумайте "Модель qua Record" здесь), вы можете выполнить эти записи, конкретные операции через другой URL-адрес, чьи бэкэнд-пакеты с одной записью за раз.
Итак, когда я использую магазины?
Чтобы хранить несколько экземпляров этой модели, вы удалили их в хранилище. Вы добавляете много моделей qua Записываете в магазины, а затем получаете доступ к этим "Модели" для вывода данных. Поэтому, если у вас есть сетка, вы, естественно, захотите иметь все эти данные локально, без необходимости повторно запрашивать сервер для каждого отображения строки.
Из первый пост:
Модели обычно используются с Магазином, который в основном является сбор экземпляров модели.
И, конечно же, магазины, по-видимому, извлекают информацию из Model qua Model здесь, чтобы знать, что они несут.
Ответ 3
Я нашел его в документации по архитектуре приложений App Store Part 2
Использовать прокси для моделей:
Как правило, это хорошая практика, поскольку она позволяет загружать и сохранять экземпляры этой модели без необходимости хранить. Кроме того, когда несколько магазинов используют эту же модель, вам не нужно переопределять прокси на каждом из них.
Использовать прокси для магазинов:
В Ext JS 4 несколько магазинов могут использовать одну и ту же модель данных, даже если магазины будут загружать свои данные из разных источников. В нашем примере, модель станции будет использоваться поисковыми службами и станциями хранить, как загружая данные из другого места. Один возвращается результаты поиска, другой возвращает любимые станции пользователей. к Для этого один из наших магазинов должен будет переопределить прокси-сервер определенных на модели.