понедельник, 7 июля 2014 г.

ViewController: первые шаги

Как известно, в ExtJs 5 помимо обычных MVC-контроллеров, появился новый тип контроллеров - ViewController. О нём и поведу речь. Но сначала два слова о старых контроллерах.

Старые контроллеры могли существовать только в одном экземпляре. Из них было удобно управлять представлением (таблицей, диаграммой, шаблоном и т.д.), которое также существует в единственном экземпляре. Подсовывая в такое представление разные наборы данных, загружаемых с сервера, создавали впечатление что представлений много. Такой подход значительно сокращал количество элементов в DOM. Однако в том случае, когда на экране нужно одновременно отобразить несколько экземпляров представления, работа с контроллером несколько усложнялась, поскольку теперь нужно управлять коллекцией представлений. Инструменты, предоставляемые контроллером не были приспособлены для управления коллекциями. Вспомните, например, refs и автоматически генерируемые методы...

И вот на сцену выходят "контроллеры представления". Под каждый новый экземпляр графического представления создаётся отдельный экземпляр контроллера. При уничтожении представления уничтожается и его персональный контроллер. Нововведение значительно оздоровило создаваемый код. В новые контроллеры пишем то, что писали раньше при определении listeners представления. То есть, код представления всё больше становится похожим на конфигурационный объект, практически лишённый определений функций. Все функции перекочевали в новые контроллеры.

Чтобы контроллеры у вас заработали нужно помнить несколько простых правил:
  1. добавьте полное имя класса контроллера в Application.js в параметр "views". Это не опечатка, не в параметр "controllers". В параметр "controllers" будете вносить классы старого типа контроллеров, которые по-прежнему можно создавать.
  2. внесите в тот же раздел Application.js полное имя класса представления, чтобы оно подгружалось и ещё чтобы оно попадало в сборку, создаваемую через "sencha app build".
  3. теперь соедините представление с его контроллером. Для этого в контроллере укажите параметр alias, назначив ему значение, которое содержит префикс "controller.".  Например, alias: 'controller.myapp-myviewcontroller'. В представлении укажите параметр "controller". Например так: controller: 'app-myviewcontroller'.
  4. определяя обработчики событий представления в listeners, укажите названия методов его контролера.
Посмотреть примеры кода.

Если нужно, чтобы новые контроллеры общались между собой, следует использовать параметр "config". Ниже перечислены все три этапа межконтроллерного взаимодействия.

1. Назначим обработчик события в представлении.



2. В родном контроллере выбрасываем событие, для прослушивания прочими контроллерами.


3. Чужой контроллер "улавливает сигнал" и вносит изменение в своё представление.


Замечу, что для прослушивания всех контроллеров, нужно написать звёздочку вместо имени конкретного контроллера.

Поскольку такая техника работы может привести к многоразовой перерисовке всего веб-интерфейса, полезно останавливать рендеринг на время при помощи Ext.suspendLayouts(). Если этого не сделать, то всё будет происходить жутко медленно.

Вот такие они новые контроллеры...

Вот ещё один способ работы с контроллерами представлений.