WebGUI Директивы
Старинца все еще в разработке
WebGUI - удобный каркас для создания компонентов для web страниц компонент удобно будет использовать из JS, шаблонов и биндингов разного вида. Это расширяет рынок на который выходят ваши компоненты и увеличивает повторное использование
Initialization
require or define dependency for module static/vendor/agui/aplib
define( [ "static/vendor/agui/aplib", // todo не понятно зачем, просто почем то иногда в других директивах на этот компонент ругать идёт ], function(_){...} ); // or require(["static/vendor/agui/aplib"],function(_){ ... });
ap-lazyrepeat
Работает аналогично al-repeat, но лениво, т.е. лучше.
Если модель осталась без изменений количества элементов, а поменялись только сами они или добавлся или удалился один
, то весь список не пересоздаётся а изменяется, соответственно изменению модели. изменения DOM минимизируются.
Итерировать можно как списки массивы, так и объекты словари по их ключам.
Пример
<path ap-lazyrepeat="nodeid in nodes" ap-attr="d::nodeid && nodes[nodeid]._edge2()._edge2" fill="none" stroke="rgba(0,0,0, 0.7)" stroke-width="2" stroke-linecap="round" d="M0,0M1,1" ></path>
Здесь nodes это словарь с объектами, где ключ - строка идентификатор.
ap-attr
Установка аттрибута. Часто бывает нельзя ставить аттрибут через текстовые директивы ({{}}).
Например такая работа в SVG неприемлима, т.к. движок SVG видит недопустимые значения в полях, где ожидается заданный формат. А установить программно аттрибут требуется.
Или , для примера, img src= тоже не допускает выражений вида {{}}.
Но для этого, конечно, существует al-src.
Пример использования
ap-attr="d::nodeid && nodes[nodeid]._edge2()._edge2"
Здесь до :: пишем имя аттрибута , а после выражение для вычисления значения.
ap-listen
Директива слушает события на элементе, и вызывает expr в рамках контекста, заданнный декларативно.
Имеются переменные, доступные в выражении :
-
$evt- in context o expr an event -
$param2- параметр переданный при создании сообщения (trigger)
Они могут быть использованы при обработке события.
Например, Если событие генерировалось так : $(e).trigger('event_name',a,b) ,
то в обработчик доступно $evt само событие, и $param2 === a.
Для прослушки нескольких событий делать так (пример):
ap-listen="EditEvent :: nodes[nodeid]._setProperty('title', $evt.target.attributes['eip-value'].value ); nodes[nodeid].titleEditMode = 'false'; :: click :: nodes[nodeid]._select(); debugger; this.$scan(); return true;"
События и действия разделяется двойными двоеточиями :: попарно.
Здесь до :: пишем имя события и после разделителя выражение для вычисления.
Возвращаемый результат не используется
ap-qtip2
Директива делает всплывающую подсказку на элементе с заданным содержимым. По сути это qtip2 по человечески в виде директивы (http://qtip2.com/)

Вы должны включить в страницу css ./static/vendor/agui/lib/qtip2/jquery.qtip.min.css
пример использования :
<head> ... <!-- Для компонента qtip2 (info circle)--> <link rel="stylesheet" href="/static/vendor/agui/lib/qtip2/jquery.qtip.min.css"/> ... </head> <span class="info_circle" ap-qtip2="info_block" al-click="$item._select(); debugger; $parent.nodeEditState='open';" > ... <div class="info_block" > <span>Информация</span> <br> <div class="div_table"> <div class="divRow" al-repeat="propName in nodes[nodeid].type.propertyOrder"> <div class="divCell"> {{propName}} </div> <div class="divCell"> {{ nodes[nodeid].properties[propName] }} </div> </div> </div> </div>
в параметре ap-qtip2="info_block" задаётся имя класса элемента следующего (.next) за текущим,
который будет показан как тултип
В планах :
- поддержать кучу опций компонента
ap-resizable
Делает любой элемент изменяемого размера и позволяет обрабатывать эти измеения.
Или другими словами Делаем элемент растяжимым
Директива имеет несколько параметров разделяемых через ::.
формат <как растягивается?>::<start expr> :: <stop expr> :: [<zoomScale>]
- Формат первого аргумента - стороны света "A comma delimited list of any of the following: n, e, s, w, ne, se, sw, nw, all"
- Выражения,вызываемые в начале resize юзером и в конце.
- Формат zoomScale число. не обязательный.
Параметры выражений:
- параметры start :
['$evt'] - параметры stop :
['$evt', '$w', '$h']. Сюда передаются новые размеры, можно их применить в модель.
Пример использования
<div ap-resizable=" e :: :: nodes[nodeid]._resize( $w/dpi.get(false) /*,$h/dpi.get(false)*/ ); :: scale " > </div>
ap-getsize
Берём и кладём в модель данные о реальном размере элемента $w, $h.
пример 1
ap-getsize="nodes[nodeid].w=$w; nodes[nodeid].h=$h;"
Имеются параметры выражения $w и $h.
пример2
ap-getsize=" nodeid ? nodes[nodeid].realw=$w/dpi.get(false): 0; nodeid ? nodes[nodeid].realh=$h/dpi.get(false): 0;"
устанавливаем размер в модель, если она "достаточно инициализирована ;)"
Этот код сработает при любом раскладе. не важно почему именно изменился размер. вомоно внутрь подгрузился контент и, например, изменилась высота.
Данная директива собирает данные по $scan(), а не в момент изменения размера! Т.е. момент опроса - управляемый.
ap-optionalattr
У элемента появится опциональный аттрибут, если выполнится условие, пример :
ap-optionalAttr="disabled:!connected"
Часто надо задизаблить, например input.
ap-window
Окно popup, или jquery ui dialog.
Только работает декларативно, а не через JS.
Пример
TODO компонент и синтаксис будует переписан, но я хоть что-то покажу
* AL+ TODO ap-window='{"status":"nodes[nodeid].editMode"}'
* важно соблюсти виды кавычек
* значение - json struct
*
* title - не обязательная настройка
*
* зависимость : jQueryUI
*
* TODO переписать
* по контексту: октрывать окно можно по любой доступной переменной
* в любом доступном контексте
* но КОНТЕНТ окна работает в контексте всего body.
* если на body есть контекст -
* то на нём и работают привязки в разметке контента окна
* Важно: => нет смысла описывать такое окно в чилд контексте
*
* state -> "open", "closed_ok", "closed_cancel",
*
ap-click
Позволяет событиям проходить внутрь элемента а не останавливает их на конкретном элементе, как это делает al-click=.
Быват нужно, когда кнопка внутри строки которую щелчком можно выделить - чтобы щелчок по кнопке доходил до нее, а не выделял строку, например.
пример:
<tr al-repeat="server in servers" ap-click="on_server_select()" al-css="info:server.objid==server_selected.objid" > <td>{{server.id}}</td> <td al-css="text-success: server.connected==true, text-danger: server.connected==false" ><b>{{server.name}} ({{server.connected ? 'Online' : 'Offline'}})</b> </td> <!-- не редактируем адрес т.к. нет метода на сервере для изменения адреса ap-jeditable="{value:'server.address', callback: on_server_edit_address }" --> <td>{{server.address}}</td> <td>{{format_timezone_offset( server.timezone_offset )}}</td> <!--знак плюс для положительных--> <td> {{server.s_ostype}}</td> <td> {{server.s_dbtype}}</td> <td title="Статус БД"> {{server.r_db_state}}</td> <td> {{server.r_connection_state=='Ok' ? 'nginx' : 'ssl_direct'}}</td> <td> {{server.r_jboss_state}}</td> <td> <a href="/updatedeploy/api/resources/standalone-config/{{server.getid ? server.getid().getid : -1 }}/jboss" target="_blank">Standalone config</a> <a href="/updatedeploy/api/resources/log/{{server.getid ? server.getid().getid : -1 }}/jboss" target="_blank">JBoss</a> <a href="/updatedeploy/api/resources/log/{{server.getid ? server.getid().getid : -1 }}/tornado" target="_blank">Tornado</a> <a href="https://{{server.address}}/updatedeploy" target="_blank">ЛК</a> </td> <td><span type="button btn-xs" class="glyphicon glyphicon-refresh glyphicon-big" title="Переподключится" al-click="on_server_force_reconnect(server)" ></span> <span type="button btn-xs" class="glyphicon glyphicon-wrench glyphicon-big" title="Редактировать сервер" al-click="on_server_edit_start(server)" ></span> </td> <td><span type="button btn-sm" class="glyphicon glyphicon-trash glyphicon-big" title="Удалить сервер" al-click="on_removeserver(server)" ></span> </td> </tr>
Тут сразу комбинируются и al-click и ap-click. Каждому - своё место.
ap-select
Простейший комбобокс-выбиралка, для прототипов, например. Есть в компонентах нормальный выбиралки.
Пример использования "вслепую"
<select ap-select="dpp"> </select>
здесь в поле контекста dpp находится список элементов для итерирования
Пример использования "кастом"
<select ap-select="dpp"> <option> бла бла бла{{_val}}</option> </select>
тут можно задать свободно формат опции.
При выборе опции меняется поле контекста "<name>_selected", в данном случае меняется dpp_selected на выбраный элемент.
Comments
Comments powered by Disqus