Теги активации
Теги активации определяют действия пользователей или события, которые могут перевести контекст диалога в тот или иной стейт. Все теги активации делятся на два вида: локальные и глобальные.
- По локальному тегу переход в стейт возможен только из ближайшего родительского, из соседних или дочерних стейтов.
- По глобальному тегу диалог может перейти в стейт из любого другого стейта в сценарии. Названия глобальных тегов заканчиваются на
!
.
Тег | Описание |
---|---|
q q! | Объявляет паттерн, по которому диалог может перейти в стейт. |
intent intent! | Объявляет интент, по которому диалог может перейти в стейт. |
intentGroup intentGroup! | Объявляет группу интентов, по которым диалог может перейти в стейт. |
event event! | Объявляет событие, по которому диалог может перейти в стейт. |
Параметры
Параметры — пары «ключ — значение», которые отделяются от названия или значения тега (если оно есть) двумя вертикальными чертами. Если параметров несколько, они отделяются друг от друга запятыми. Параметры позволяют модифицировать поведение тега.
Для локальных тегов q
, intent
, intentGroup
и event
могут быть заданы параметры:
Параметр | Тип | Описание | Значение по умолчанию |
---|---|---|---|
fromState | Строка | Путь до стейта, из которого возможен переход в текущий стейт по данному тегу активации. | — |
toState | Строка | Путь до стейта, в который возможен переход из текущего стейта по данному тегу активации. | — |
onlyThisState | Логический | • Если true и указан параметр fromState , то переход в текущий стейт возможен строго из стейта в значении fromState , но не из его вложенных. • Если true и указан параметр toState , то переход в стейт в значении toState возможен строго из текущего стейта, но не из его вложенных. | false |
fromState
Параметр fromState
задает путь до стейта, из которого возможен переход в текущий стейт по данному тегу активации.
fromState
позволяет перевести диалог из определенного контекста в нужный стейт без использования глобальных паттернов.
Кроме того, это один из способов покинуть контекст модального стейта.Рассмотрим пример.
В сценарии ниже пользователь может выйти из контекста модального стейта OrderStatus
, если не знает номер заказа.
theme: /
state: OrderStatus || modal = true
q!: * (где/статус) * [мой] ~заказ *
a: Какой номер у вашего заказа?
state: GetNumber
q: * @duckling.number *
a: Ваш заказ уже в пути!
go!: /WhatElse
state: LocalCatchAll
event: noMatch
a: Это не похоже на номер заказа. Попробуйте еще раз.
state: WhatElse
intent: /DontKnow || fromState = "/OrderStatus"
a: Чем еще я могу помочь?
toState
Параметр toState
задает путь до стейта, в который возможен переход из текущего стейта по данному тегу активации.
fromState
и toState
одинаково, и ответ на вопрос, что лучше использовать, во многом зависит от личных предпочтений.
Когда из стейта нужно задать возможность перехода в несколько стейтов, разбросанные по разным частям сценария,
то предпочтительнее toState
: он позволяет держать всю информацию, связанную с возможными изменениями контекста, в одном месте.Следующий пример работает так же, как предыдущий.
Обратите внимание, что теги активации с параметром toState
обычно пишутся после тегов реакций.
theme: /
state: OrderStatus || modal = true
q!: * (где/статус) * [мой] ~заказ *
a: Какой номер у вашего заказа?
intent: /DontKnow || toState = "/WhatElse"
state: GetNumber
q: * @duckling.number *
a: Ваш заказ уже в пути!
go!: /WhatElse
state: LocalCatchAll
event: noMatch
a: Это не похоже на номер заказа. Попробуйте еще раз.
state: WhatElse
a: Чем еще я могу помочь?
onlyThisState
Параметр onlyThisState
используется совместно с fromState
или toState
.
При значении true
он накладывает ограничения на стейт, из которого или в который можно перейти по данному тегу активации.
- Если указан параметр
fromState
, то переход в текущий стейт возможен строго из стейта в значенииfromState
, но не из его вложенных. - Если указан параметр
toState
, то переход в стейт в значенииtoState
возможен строго из текущего стейта, но не из его вложенных.
Рассмотрим пример.
Если в предыдущем сценарии в стейт /WhatElse
можно перейти из /OrderStatus
и /OrderStatus/LocalCatchAll
,
то в примере ниже только из /OrderStatus
.
theme: /
state: OrderStatus || modal = true
q!: * (где/статус) * [мой] ~заказ *
a: Какой номер у вашего заказа?
intent: /DontKnow || toState = "/OrderStatus", onlyThisState = true
state: GetNumber
q: * @duckling.number *
a: Ваш заказ уже в пути!
go!: /WhatElse
state: LocalCatchAll
event: noMatch
a: Это не похоже на номер заказа. Попробуйте еще раз.
state: WhatElse
a: Чем еще я могу помочь?