Триггеры
Триггер выполняет действия, когда изменяется значение переменной и выполняется заданное условие. Триггеры объявляются на уровне карточки и на уровне отдельного элемента. Все параметры триггера перечислены в справочнике.
Триггеры карточки
После изменения значения переменной, кроме обновления всех свойств, в которых используется переменная, можно выполнить любое количество действий. Для этого добавьте описание триггера в блоке variable_triggers:
-
Параметр
condition— условие выполнения действия. Может содержать логическое выражение с использованием переменных или события, по которым будет запущен триггер. -
Параметр
mode— определяет, в каком случае срабатывает действие:on_condition— действие срабатывает, если при изменении значения переменной стало выполняться условие (до этого условие не выполнялось);on_variable— действие срабатывает каждый раз, если при изменении значения переменной условие выполняется.
Например, переменные меняются несколько раз и
conditionпоследовательно принимает значенияtrue → true → false → true. При использовании значенияon_conditionдействие сработает 2 раза, при использовании значенияon_variable— 3 раза. -
Параметр
actions— описание действий, которые требуется выполнить при выполнении условия.
Ограничения:
- Условия без использования переменных (к примеру
"condition": "@{1 == 1}") или с функциями, не зависящими от переменных, не будут работать, так как без переменных не ясно, когда именно следует запускать проверку условия. - Триггер не будет срабатывать, если в условии сравниваемые между собой сущности будут иметь разные типы (к примеру, переменная логического типа сравнивается с переменной типа
integer).
Например:
{
"states": { ... },
"variables": { ... },
"variable_triggers": [
{
"condition": "@{liked}",
"actions": [
{
"url": "div-action://set_variable?name=total_likes&value=@{sum(total_likes, 1)}"
}
]
},
{
"condition": "@{subscribed && !liked}",
"mode": "on_condition",
"actions": [
{
"url": "div-action://set_state?state_id=0/subscriptions/expanded"
},
{
"log_id": "common_posts_shown",
"url": "div-action://set_state?state_id=0/common_posts/collapsed"
}
]
},
{
"condition": "@{total_likes > 100 || user_name == 'John'}",
"mode": "on_variable",
"actions": [ ... ]
}
]
}
В примере выше первый триггер будет запускать действие, которое увеличивает значение переменной total_likes каждый раз, когда значение переменной liked сменится с false на true . По такой же логике будет работать и второй триггер.
Третий триггер, благодаря параметру "mode": "on_variable", будет запускаться каждый раз при изменении значений переменных и выполнении условия в condition .
Триггеры уровня элемента
Триггеры уровня элемента срабатывают при изменении значения переменной уровня элемента. Их формат такой же, как у триггеров карточки.
Триггер уровня элемента:
-
имеет доступ к переменным уровня элемента у родительского объекта;
-
срабатывает даже для невидимых элементов (с параметром
"visibility" = "gone"/"invisible"); -
не срабатывает в состояних и табах, которые сейчас не активны;
-
при использовании внутри прототипов item_builder имеет доступ к данным текущего элемента через переменную, указанную в
data_element_name, и к индексу текущего элемента через переменнуюindex.
При переходе в новое состояние или на другой таб:
-
если состояние (таб) активируется впервые, то триггер срабатывает при выполнении условия в
condition; -
если раньше уже произошла инициализация состояния (таба) и до выхода из него условие не выполнялось, то триггер сработает, когда условие начнет выполняться.
Узнать больше
Вы можете обсуждать интересующие вас темы в сообществе пользователей DivKit в Telegram: https://t.me/divkit_community_ru.