META
Руководства
Обработчики путей @ и @@

Обработчики путей @ и @@

Система META поддерживает специальные символы для динамического разрешения путей в зависимостях и ссылках на данные

Ключевое различие между @ и @@

@@ - всегда ссылается на корневой объект (env.sp.obj)
@ - ссылается на поле с учетом текущего уровня вложенности

Пример различия в работе

В структуре item_count.fields[0] при использовании поля dispatch_organizationid:

  • @@.dispatch_organizationidenv.sp.obj.dispatch_organizationid
  • @.dispatch_organizationidenv.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.