Триггеры

Триггер выполняет действия, когда изменяется значение переменной и выполняется заданное условие. Триггеры объявляются на уровне карточки и на уровне отдельного элемента. Все параметры триггера перечислены в справочнике.

Триггеры карточки

После изменения значения переменной, кроме обновления всех свойств, в которых используется переменная, можно выполнить любое количество действий. Для этого добавьте описание триггера в блоке 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.

Репозиторий DivKit

Предыдущая