Skip to main content

Зависимости

Между виджетами, филдсетами или полями можно установить зависимости. Зависимоcти задаются выражениями на языке JavaScript.

Блокировка#

Блокировка позволяет сделать компонент недоступным для редактирования в определенных условиях.

Блокировка полей ввода#

Поле можно заблокировать по условию с помощью элемента <enabling>:

Блокирование поля по условию
<input-text id="maidenName" label="Девичья фамилия">  <dependencies>    <enabling>gender == 'woman'</enabling>    <!-- Поле "Девичья фамилия" доступно для редактирования, если пол женский -->  </dependencies></input-text>

В данном примере в выражении <enabling> используется переменная gender. Это ссылка на другое поле в этой же форме.

Для корректной работы зависимости, необходимо знать от каких полей оно зависит. Для этого производится разбор JavaScript выражения в поисках всех переменных. Иногда этот поиск не работает корректно. В таком случае все переменные необходимо прописать вручную в атрибуте on.

Перечисление переменных условия
<enabling on="gender">gender == 'woman'</enabling>

Существует короткая запись условия блокировки поля с помощью атрибута enabled. Атрибут enabled принимает значение true или false, но их можно задать через javaScript выражение, записанное в фигурных скобках:

Короткая запись условия блокировки поля
<input-text id="maidenName"  label="Девичья фамилия"  enabled="{gender == 'woman'}"/>

Блокировка филдсетов#

Филдсет можно заблокировать по условию с помощью атрибута enabled:

Блокирование филдсета по условию
<set id="woman" label="Девичья фамилия"  enabled="{gender == 'woman'}">  <!-- Филдсет "Девичья фамилия" доступен для редактирования, если пол женский -->  ...</set>

В данном примере переменная gender - это ссылка на другое поле в этой же форме.

Блокировка кнопок#

Кнопку можно заблокировать по условию с помощью атрибута enabled:

Блокирование кнопки по условию
<button label="Изменить"  enabled="{status != 1}">  <!-- Кнопка "Изменить" доступна для нажатия, -->  <!-- если статус записи не 1 -->  <invoke model="resolve" operation-id="update"/></menu-item>

В данном примере переменная status - это ссылка на поле в текущей модели виджета. Текущая модель определяется по обработчику действия при нажатии на кнопку.

Скрытие#

Скрытие позволяет сделать компонент невидимым в определенных условиях. Условия видимости записываются аналогично условиям блокировки.

Скрытие полей ввода#

Поле можно скрыть по условию с помощью элемента <visibility>:

Скрытие поля по условию
<input-text id="maidenName" label="Девичья фамилия">  <visibility on="gender">gender == 'woman'</visibility>  <!-- Поле "Девичья фамилия" видимо, если пол женский --></input-text>

Существует короткая запись условия скрытия с помощью атрибута visible, аналогично блокировке:

Короткая запись условия скрытия поля
<input-text id="maidenName"  label="Девичья фамилия"  visible="{gender == 'woman'}"/>

Скрытие филдсетов#

Филдсет можно скрыть по условию с помощью атрибута visible:

Скрытие филдсета по условию
<set id="woman" label="Девичья фамилия"  visible="{gender == 'woman'}">  <!-- Филдсет "Девичья фамилия" видим, если пол женский -->  ...</set>

Скрытие кнопок#

Кнопку <menu-item> можно скрыть по условию с помощью атрибута visible:

Скрытие кнопки по условию
<button label="Изменить"  visible="{status != 1}">  <!-- Кнопка "Изменить" видима, если статус записи не 1 -->  <invoke model="resolve" operation-id="update"/></menu-item>

Скрытие столбцов таблицы#

Столбец таблицы <column> можно скрыть по условию. Атрибуты ref-widget-id и ref-model определяют виджет и тип модели данных соответственно, которые будут использованы при вычислении видимости.

Скрытие столбца по условию
<column text-field-id="shortName">    <dependencies>        <visibility ref-widget-id="form" ref-model="resolve">type == 1</visibility>    </dependencies>    ...</column>

Установка значений#

С помощью установки значений можно предзаполнять поля ввода по заданным условиям.

Установка значения задаётся с помощью элемента <set-value>. В теле <set-value> должно быть записано выражение на языке JavaScript, которое вернёт новое значение поля командой return.

note

Чтобы значение поля не изменилось после срабатывания <set-value>, просто не нужно ничего возвращать (или вернуть undefined). Чтобы значение очистилось нужно вернуть null.

В выражении можно использовать другие поля из модели формы.

Чтобы задать триггер срабатывания установки значений, необходимо перечислить в атрибуте on от каких полей зависит выражение.

Установка значения в простом поле
<checkbox label="Адрес проживания совпадает с регистрацией">  <dependencies>    <set-value on="addressReq, addressFact">      if (addressReq == addressFact)        return true;      else        return false;    </set-value>    <!-- Если адрес проживания совпадает с адресом регистрации,-->    <!-- то чекбокс выделяется, иначе выделение снимается  -->  </dependencies></checkbox>
warning

Необходимо возвращать значение поля в том формате, в котором работает компонент. Например, списковые компоненты единственного выбора ожидают объект с id и другими свойствами. Списковые компоненты множественного выбора ожидают список объектов.

Установка значения в списковом поле единственного выбора
<select id="gender" label="Пол" query-id="gender" label-field-id="name">  <dependencies>    <set-value on="surname">      var o = new Object();      if (surname[surname.length - 1] == 'а') {        o.id = 2;        o.name = 'Женский';      } else {        o.id = 1;        o.name = 'Мужской';      }      return o;    </set-value>    <!-- Если фамилия заканчивается на 'а', -->    <!-- то пол Женский, иначе Мужской  -->  </dependencies></select>

Обязательность заполнения полей#

Можно сделать поле обязательным для заполнения в определенных условиях.

Короткая запись условия обязательности заполнения поля
<input-text id="maidenName"  label="Девичья фамилия"  required="{gender == 'woman'}"/>