Динамика
N2O разделяет шаблон и данные. Это хорошо сказывается на производительности, но может вызвать проблемы с реализацией интерфейсов, у которых шаблон зависит от данных. Для реализации таких динамических интерфейсов в N2O существует ряд приёмов.
#
Динамические свойства#
Вычисляемые значения атрибутовНекоторые атрибуты в компонентах можно задавать через ссылки или javaScript выражения:
<column label="Тип"> <!-- "{iconClass}" ссылка на поле выборки --> <icon class="{iconClass}"/></column>
<radio-group id="contactType" label="Тип контакта"> <options> <option id="1" name="Мобильный телефон"/> <option id="2" name="Электронная почта"/> </options></radio-group>
<input-text id="contactValue" label="{contactType.name}"/><!-- Заголовок поменяется при выборе типа контакта -->
<column label="Активность"> <!-- "{status == 'open'}" выражение над строкой таблицы --> <checkbox enabled="`status == 'open'`"/></column>
#
Форматирование значенийСсылки на значения можно объединять с текстом:
<column label="ФИО"> <text format="{firstName} {lastName} ({positionName})"/></column>
#
Переключатели вложенных метаданныхНекоторые вложенные метаданные можно переключать в зависимости от данных с помощью элемента switch
:
<column> <switch value-field-id="type"> <case value="type1"> <!-- Значок, если type == type1 --> <badge.../> </case> <case value="type2"> <!-- Иконка, если type == type2 --> <icon.../> </case> ... <default> <!-- Текст, в остальных случаях --> <text/> </default> </switch></column>
#
Динамические ссылки на метаданныеВ некоторых местах можно ссылаться на разные метаданные в зависимости от данных:
<button> <!-- {tableName} ссылка на поле в текущей модели данных --> <open-page page-id="{tableName}"/></button>
#
Параметризованные метаданныеВ N2O можно загружать разные метаданные по одному и тому же источнику (например, xml файлу), используя параметры. Параметры задаются в идентификаторе метаданной после знака "вопрос":
id?param1=value1¶m2=value2
important
Параметры не могут содержать зарезервированные символы URI, такие как &?/#; и другие. Либо такие символы должны быть закодированы (UriEncode).
Параметры могут быть константными:
<fields> <select label="Организация" query-id="refbook?table=organization"/> <select label="Подразделение" query-id="refbook?table=department"/></fields>
Чтобы использовать параметр необходимо вставить его код в знак $
и фигурные скобки ${param}
, аналогично настройкам:
<query> <list> <sql>select * from ${table}</sql> </list> ...</query>
#
Генерация метаданныхВ N2O метаданные можно сгенерировать в момент их первой загрузки с помощью провайдеров на языке java.
Для этого необходимо создать реализацию интерфейса DynamicMetadataProvider
, и зарегистрировать её в качестве Spring Bean.
@Servicepublic class MyTableProvider implements DynamicMetadataProvider { /** * @return Код провайдера */ @Override public String getCode() { return "myTableProvider"; }
/** * @param params Параметры провайдера * @return Список сгенерированных метаданных */ @Override public List<? extends N2oMetadata> provide(String params) { ... } /** * @return Типы генерируемых метаданных */ public Collection<Class<? extends N2oMetadata>> getMetadataClasses() { return Arrays.asList(N2oTable.class); }
}
Чтобы сослаться на такую метаданную,
необходимо в качестве идентификатора метаданной указать код провайдера,
а параметры передать после знака ?
:
<table ref-id="myTableProvider?param=123"/>