07.06.2012, 14:40
|
Интересующийся
|
|
Регистрация: 02.07.2010
Сообщений: 12
|
|
Контроллеры в EXT 4
Объясните плз какую именно логику нужно ложить в контроллеры в EXT 4 а что ложить во View ??
|
|
07.06.2012, 14:55
|
С++/C# modest developer
|
|
Регистрация: 07.11.2011
Сообщений: 244
|
|
unet900,
В идеале все методы, кроме initComponent, должны храниться в контроллере, во view только представление (в частности лэйаутинг компонентов). Почитайте -> http://docs.sencha.com/ext-js/4-1/#!...n_architecture
|
|
21.06.2012, 13:59
|
Аспирант
|
|
Регистрация: 24.04.2010
Сообщений: 87
|
|
Да... Только если скачать ихний же Sencha Architect 2 (он триальный) и попробовать сваять там приложение MVC, то например логику обработки событий кнопок оно само ложит в view...
Создалось впечатление, что в самой Сенча начали понимать, что с MVC несколько перемудрили...
Да и вот: http://javascript.ru/forum/showthrea...005#post183005
Последний раз редактировалось Allan Stark, 21.06.2012 в 14:02.
|
|
21.06.2012, 21:26
|
Профессор
|
|
Регистрация: 04.02.2011
Сообщений: 1,815
|
|
Что касается архитектуры extjs вообще.
Чуть ли не все классы(model/view/controller/component и тд) в extJs, реализует модель поведения observer.
грубо говоря паттерн observer отслеживает события в классах и реагирует на них, а также может сам генерировать события.
View тоже наследует модель поведения от observer, а значит мы можем работать с событиями в view. Но если событий в view стало слишком много, или нам нужно работать с несколькими view, то мы можем создать контроллёр(опять же наследующий observer) которому мы дадим задачу следить за интерисующими нас классами, и заставим контролёр обрабатывать события.
Вдумайтесь.
-Когда мы встаиваем компонент в view, и обрабатываем события компонентов в view, то по сути view в этом случае функционирует как обсервер следящий за событиями в компонентах. Если вложенность больше, то это не что другое как обсервер , следящий за событиями другого observer'а.
-Когда мы создаём контролёр по сути это тот же обсервер следящий за событиями, но в отличии от копонент и view, контролёр нечего неотображает на экране. Думаю при желании один контролёр можно даже научить следить за событиями другого контролёра.
Если угодно то в ExtJs контролёр можно воспринимать как вспомогательную надстройку/следилку за событиями, которую можно использовать по желанию/необходимости. ОДнако необязательность контролёра не означает что он не нужен совсем.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Последний раз редактировалось DjDiablo, 22.06.2012 в 13:05.
|
|
21.06.2012, 22:07
|
Профессор
|
|
Регистрация: 04.02.2011
Сообщений: 1,815
|
|
Продемонстрирую несколько подходов
пример 1. Толстый VIEW, он же Быдлокод.
задача. надо нажать на три кнопки, тогда запустится какаянибудь сложная логика.
реализация:
1) в view есть обработчик событий, увеличивающий счётчик при нажатии каждой кнопки.
2) когда значение счётчика достигает 3х, view запускает функцию с требуемой логикой .
3) Исполняется функции с логикой, код функции полностью расположен в view.
получаем огромный уродливый view.
пример 2. Не чистый MVC, реализация слабой связанности паттерном Observer(Наблюдатель).
задача. надо нажать на три кнопки, тогда запустится какаянибудь сложная логика.
реализация:
1) в view есть обработчик событий, увеличивающий счётчик при нажатии каждой кнопки.
2) когда значение счётчика достигает 3х, view генерирует события FIRERUN.
3) подписанный на событие FIRERUN контролёр, видит сообытие и выполняет логику.
вроде всё красиво, хоть идеология MVC не соблюдена в полной мере.
пример 3. чистый MVC с толстым контролёром
Здесь строго настроuо запрещено реагировать на любые события в View, можно только в контролёре.
реализация:
В этом случае реакция на события кнопки происходит в контролёре, когда счётчик достигает 3х запускается метод расположенный в этом же контроллёре.
Иметь толстенький контролёр порой тоже нужно, но чаще не красиво, особенно когда речь идёт об обработке данных.
пример 4. чистый MVC с тонким контролёром
реализация:
всё как в третим примере, однако "сложная логика " (предположим что это обработка данных), размещена не в контролёре а в store или model. А может даже распределена между store и model.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Последний раз редактировалось DjDiablo, 22.06.2012 в 13:06.
|
|
27.09.2012, 14:17
|
Новичок на форуме
|
|
Регистрация: 27.09.2012
Сообщений: 1
|
|
Подскажите, пожалуйста, как будет выглядеть чистый MVC с тонким котроллером для следующей задачи.
В зависимости от принадлежности пользователя к определенной группе необходимо показывать различные наборы кнопок на тулбаре. Откуда должно идти обращение к БД на сервере, чтобы получить группу или список доступных компонент и где эти компоненты должны создаваться? в контроллере или в вьюпорте?
|
|
28.09.2012, 19:17
|
Профессор
|
|
Регистрация: 04.02.2011
Сообщений: 1,815
|
|
я боюсь что вопрос "как должно быть" не уместен, есть только удобно для вас и неудобно.
Если тулбар более менее сложный то его есть смысл выделить в отдельный компонент.
тогда будет две вероятности , либо подключать разные тулбары в зависимости от группы, либо тулбар должен сам заполнить себя кнопками в зависимости от группы (к примеру будут подключены различные наборы items в initComponents вашего тулбара)
нажатие на кнопки обычно обычно стоит слушать в контролёре.
данные для инициализации приложения можно комфортно получить в application это тоже контролёр, но он контролирует всё приложение.
можно пойти дальше и подключать в application тот viewport который содержит только нужные пользователю компоненты.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Последний раз редактировалось DjDiablo, 28.09.2012 в 20:18.
|
|
01.10.2012, 12:05
|
Аспирант
|
|
Регистрация: 24.04.2010
Сообщений: 87
|
|
Кстати, так и не разобрался, как скажем в контроллере, контролирующем некоторый вью с гридом и кнопками достучаться в обработчике событий к событию нажатия например кнопки?
Например в контроллере:
Ext.define('App.controller.controller_invoices', {
extend: 'Ext.app.Controller',
views: ['view_invoices_list'],
init: function() {
this.control({
'view_invoices_list': {
itemclick: function(view, record, item, index, e, obj) {
// тут обрабатываем клик в гриде
}
});
}
});
Тут все понятно, контроллер следит за ивентами конкретно в гриде (того, который во вью alias:'view_invoices_list').
А как в init: function() зарегистрировать обработчик клика других интерактивных элементов вью, помимо грида, например произвольной кнопки в панели dockedItems грида ?
|
|
01.10.2012, 13:10
|
Аспирант
|
|
Регистрация: 24.04.2010
Сообщений: 87
|
|
Разобрался.
Вот это будет работать:
init: function() {
'view_invoices_list': {
// тут обрабатываем события в гриде view_invoices_list
},
'view_certs_preview_area #print_button': {
// а тут обрабатываем события в кнопке в панели dockedItems
}
}
[off]Честно говоря, начала эта ExtJS меня уже разочаровывать. Вроде и документации навалом, а многие вещи приходится добывать черте-где, в примерах на сторонних сайтах в 10-й странице гуглопоиска, да еще в документации одно и то же разными подходами описывается, попробуй догадайся, какой из них правильный...[/off]
|
|
04.10.2012, 15:54
|
Профессор
|
|
Регистрация: 04.02.2011
Сообщений: 1,815
|
|
Аналогично, элемент разочарования присутствует.
На самом деле, на extjs многие вещи реализуются сложнее чем без него.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Последний раз редактировалось DjDiablo, 04.10.2012 в 16:53.
|
|
|
|