-
Notifications
You must be signed in to change notification settings - Fork 9
use.block
ВНИМАНИЕ: в новых разработках рекомендуется использовать show_block.
Это (устаревшая) функция загрузки блока приложения с заданным именем. Например, процедура отображения общей разметки страницы (сама вызываемая по ходу загрузки блока main), может содержать следующий фрагмент:
use.block ('auth_toolbar') // верхняя панель use.block ('menu') // боковое меню use.block ($_REQUEST.type) // то, что, собственно, хотел увидеть пользователь, открывая данный URL
Блоки — это программные единицы приложений на базе elu.js, каждая из которых имеет:
- символическое имя (формат: как идентификатор C, пакетов/пространств имён нет);
- определённое место на экране;
- источник данных, которые там отображаются;
- набор действий, связанных именно с этими данными.
А вот панель поиска/фильтрации над таблицей сотрудников отдельным блоком делать нельзя: ведь её поля ввода управляют содержимым тела таблицы, а не самой панели.
С точки зрения клиентского программного кода, каждый блок — это ровно три одноимённых файла, расположенных каждый в своей директории. Два из них являются модулями requirejs, а третий — шаблоном HTML5.
Это requirejs-модуль, определяющий источник данных для блока.
В течение своей загрузки он определяет обработчики действий (см. $_DO), а в результате выдаёт функцию, которая:
- формирует объект данных (обычно вызовом query, но возможно, с использованием локально хранимой информации)
- передаёт его функции, полученной в качестве единственного параметра.
define ([], function () { /// ... здесь определяются компоненты $_DO ... /// return function (done) { query ( // будет запущен AJAX-запрос {}, // с параметрами type и id из текущего $_REQUEST {}, // без дополнительных параметров, done // а для полученного объекта data будет вызвана done (data) ) } });
Первые два параметра query могут быть и непусты. Например, если параметр type
в AJAX-запросе отличен от $_REQUEST.type ('users' вместо 'user'):
return function (done) { query ({type: "users"}, {}, done) }
или, скажем, передаются дополнительные параметры поиска:
return function (done) { query ({}, {query: values ($(#queryForm))}, done) }
Как показано выше, в качестве третьего параметра query обычно достаточно просто передать функцию отображения, полученную на входе. Однако иногда в data-модуле требуется произвести некоторые дополнительные действия с полученными данными, тогда создаётся функция-обёртка.
Рассмотрим пример упрощённой схемы single sign on: если по ходу загрузки главного модуля выясняется, что $_USER не определён, то на сервер отправляется запрос ?type=sessions&action=create, в ответ на который должен прийти объект данных с карточкой текущего пользователя:
return function (done) { if ($_USER) return done () query ({type: 'sessions', action: 'create'}, {}, function (data) { if (!data || !data.user) redirect ('/') setup_user (data.user) done () }) }
Впрочем, не исключён и вырожденный случай, когда модуль для первичного отображения не требует никаких данных с сервера: тогда всё, что нужно -- вызвать done напрямую:
return function (done) { done () }
В elu.js есть вспомогательная API-функция, реализация которой как раз сводится к вызову первого аргумента без параметров: она называется fire. Так что исходный текст data-модуля простейшего блока, никак не обращающегося к серверу, сводится к одной строке:
define ([], function () {return fire});
В этом файле находится HTML-код, который требуется отобразить в соответствующей области экрана, обогатив данными, полученными data-модулем.
Формат: стандартный HTML5 без каких-либо синтаксических расширений. Все преобразования (сокрытие, тиражирование фрагментов и т. п.) должны осуществляться во view-модуле, в основном функцией fill.
Этот requirejs-модуль экспортирует функцию, которая:
- принимает на вход 2 параметра:
- объект данных, полученный data-модулем;
- HTML-шаблон в виде jQuery-объекта;
- заполняет шаблон данными;
- выводит полученный результат в свою область;
- (обычно) определяет функцию $_F5 для обновления этой области актуальными данными без перезагрузки страницы и даже блока в целом;
- назначает для элементов области (и, возможно, остального экрана) обработчики js-событий:
- те из них, что требуют запросов к серверу, должны быть ранее определены в data-модуле как компоненты $_DO.