Обработчики путей @ и @@
Система META поддерживает специальные символы для динамического разрешения путей в зависимостях и ссылках на данные
Ключевое различие между @ и @@
@@
- всегда ссылается на корневой объект (env.sp.obj
)
@
- ссылается на поле с учетом текущего уровня вложенности
Пример различия в работе
В структуре item_count.fields[0]
при использовании поля dispatch_organizationid
:
@@.dispatch_organizationid
→env.sp.obj.dispatch_organizationid
@.dispatch_organizationid
→env.sp.obj.item_count.fields[0].dispatch_organizationid
Обработчик "@@" - Ссылка на текущий объект
Символ @@
представляет собой алиас для пути env.sp.obj
- объекта, который в данный момент обрабатывается в форме или на странице.
Принцип работы
При обработке запроса все вхождения @@
заменяются на env.sp.obj
:
// Внутренняя логика
if(path.indexOf('@@') > -1) {
return path.replace(/@@/g, "env.sp.obj");
}
Пример использования
Использование в зависимостях с алиасом
# В me-lego-list внутри поля item_count
- alias: dispatch_organizationid
db_type: integer
name: dispatch_organizationid
display_name: "Организация-отправитель"
foreign_entity_id: '2630'
lego_elem:
span: 6
- db_type: jsonb
name: item_count
alias: item_count
display_name: "Варианты ответов"
lego_elem:
name: me-lego
elems:
- name: me-lego-list
id: fields
elems:
- id: organization_id_2
label: "Организация 2"
name: me-input
depends: ["@@.dispatch_organizationid as dispatch_organizationid"]
В данном примере @@.dispatch_organizationid
всегда ссылается на корневой объект и будет разрешен как env.sp.obj.dispatch_organizationid
, независимо от уровня вложенности элемента.
Обращение к содержимому item_count извне
# Поле вне item_count, которое зависит от его содержимого
- alias: summary_field
db_type: text
name: summary_field
display_name: "Сводка по item_count"
lego_elem:
depends: ["@.item_count as item_count"]
В данном примере @.item_count
будет разрешен как env.sp.obj.item_count
, что позволит получить доступ к содержимому поля item_count
.
Обработчик "@" - Ссылки на родительские элементы
Символ @
используется для создания ссылок на поля родительского элемента в иерархических структурах данных.
Принцип работы
При обработке запроса @.field_name
заменяется на путь к родительскому элементу плюс имя поля. В отличие от @@
, который всегда заменяется на env.sp.obj
, обработчик @
может подставлять дополнительный путь между env.sp.obj
и именем поля, в зависимости от уровня вложенности элемента:
// Внутренняя логика
if(path.indexOf('@') > -1) {
let replaceNewContent = this.getParentOutputPath(); // получает путь к родительскому элементу
let replaceSource = '@';
return replaceAll(path, replaceSource, replaceNewContent);
}
Пример использования
Ссылка на поле с учетом уровня вложенности
# В me-lego-list внутри поля item_count
- alias: dispatch_organizationid
db_type: integer
name: dispatch_organizationid
display_name: "Организация-отправитель"
foreign_entity_id: '2630'
lego_elem:
span: 6
- db_type: jsonb
name: item_count
alias: item_count
display_name: "Варианты ответов"
lego_elem:
name: me-lego
elems:
- name: me-lego-list
id: fields
elems:
- id: organization_id_2
label: "Организация 2"
name: me-input
depends: ["@.dispatch_organizationid as dispatch_organizationid"]
В данном примере @.dispatch_organizationid
будет разрешен как env.sp.obj.item_count.fields[0].dispatch_organizationid
, то есть с учетом полного пути к текущему элементу в иерархии.
Обращение к содержимому item_count извне
# Поле вне item_count, которое зависит от его содержимого
- alias: summary_field
db_type: text
name: summary_field
display_name: "Сводка по item_count"
lego_elem:
depends: ["@.item_count as item_count"]
В данном примере @.item_count
будет разрешен как env.sp.obj.item_count
, что позволит получить доступ к содержимому поля item_count
.