Spec-Zone.ru › Angular

Переменные в шаблонах

В шаблонах Angular есть два типа объявлений переменных: локальные переменные шаблона и переменные ссылок на шаблон.

ПОЛЕЗНО: В этом руководстве под «шаблоном» понимается не весь HTML-файл шаблона. Так называется только конкретная конструкция или выражение шаблона внутри файла.

Локальные переменные шаблона с помощью @let

Синтаксис @let в Angular позволяет объявлять локальную переменную и повторно использовать её в шаблоне, подобно синтаксису let в JavaScript.

Использование @let

Используйте @let, чтобы объявить переменную, значение которой определяется результатом выражения шаблона. Angular автоматически поддерживает актуальность значения переменной в соответствии с заданным выражением, как и в случае с привязками.

@let name = user.name;
@let greeting = 'Hello, ' + name;
@let data = data$ | async;
@let pi = 3.14159;
@let coordinates = {x: 50, y: 100};
@let longExpression =
  'Lorem ipsum dolor sit amet, consectetur adipiscing elit ' +
  'sed do eiusmod tempor incididunt ut labore et dolore magna ' +
  'Ut enim ad minim veniam...';

Каждый блок @let может объявлять ровно одну переменную. Нельзя объявлять несколько переменных в одном блоке через запятую.

Обращение к значению @let

Объявив переменную с помощью @let, её можно повторно использовать в том же шаблоне:

@let user = user$ | async;

@if (user) {
  <h1>Hello, {{ user.name }}</h1>
  <user-avatar [photo]="user.photo" />

  <ul>
    @for (snack of user.favoriteSnacks; track snack.id) {
      <li>{{ snack.name }}</li>
    }
  </ul>

  <button (click)="update(user)">Update profile</button>
}

Возможность присваивания

Ключевое отличие @let от let в JavaScript состоит в том, что @let нельзя переназначить после объявления. Однако Angular автоматически поддерживает актуальность значения переменной в соответствии с заданным выражением.

@let value = 1;

<!-- Invalid - This does not work! -->
<button (click)="value = value + 1">Increment the value</button>

Область видимости переменных

Объявления @let имеют область видимости текущего представления и его потомков. Angular создаёт новое представление на границах компонентов и везде, где шаблон может содержать динамический контент, например в блоках управления потоком, блоках @defer или структурных директивах.

Поскольку объявления @let не поднимаются, к ним нельзя обращаться из родительских представлений или соседних представлений:

@let topLevel = value;

<div>
  @let insideDiv = value;
</div>

<!-- Valid -->
{{ topLevel }}
<!-- Valid -->
{{ insideDiv }}

@if (condition) {
  <!-- Valid -->
  {{ topLevel + insideDiv }}

  @let nested = value;

  @if (condition) {
    <!-- Valid -->
    {{ topLevel + insideDiv + nested }}
  }
}

<!-- Error, not hoisted from @if -->
{{ nested }}

Полный синтаксис

Формальное определение синтаксиса @let:

  • Ключевое слово @let.
  • За ним следуют один или несколько пробельных символов, кроме символов новой строки.
  • За ними следует допустимое имя JavaScript и ноль или более пробельных символов.
  • Затем следует символ = и ноль или более пробельных символов.
  • Затем следует выражение Angular, которое может занимать несколько строк.
  • В конце ставится символ ;.

Переменные ссылок на шаблон

Переменные ссылок на шаблон позволяют объявить переменную, которая ссылается на значение элемента в шаблоне.

Переменная ссылки на шаблон может ссылаться на:

  • элемент DOM в шаблоне (включая пользовательские элементы)
  • компонент или директиву Angular
  • TemplateRef из элемента ng-template

С помощью переменных ссылок на шаблон можно считывать информацию из одной части шаблона в другой его части.

Объявление переменной ссылки на шаблон

Чтобы объявить переменную для элемента шаблона, добавьте атрибут, который начинается с символа решётки (#), за которым следует имя переменной.

<!-- Create a template reference variable named "taskInput", referring to the HTMLInputElement. -->
<input #taskInput placeholder="Enter task name" />

Назначение значений переменным ссылок на шаблон

Angular назначает переменным шаблона значения в зависимости от элемента, для которого они объявлены.

Если объявить переменную для компонента Angular, она будет ссылаться на экземпляр компонента.

<!-- The `startDate` variable is assigned the instance of `MyDatepicker`. -->
<my-datepicker #startDate />

Если объявить переменную для элемента <ng-template>, она будет ссылаться на экземпляр TemplateRef, представляющий шаблон. Подробнее см. в разделе Как Angular использует синтаксис со звёздочкой, * в статье Структурные директивы.

<!-- The `myFragment` variable is assigned the `TemplateRef` instance corresponding to this template fragment. -->
<ng-template #myFragment>
  <p>This is a template fragment</p>
</ng-template>

Если объявить переменную для любого другого отображаемого элемента, она будет ссылаться на экземпляр HTMLElement.

<!-- The "taskInput" variable refers to the HTMLInputElement instance. -->
<input #taskInput placeholder="Enter task name" />

Ссылка на директиву Angular

У директив Angular может быть свойство exportAs, задающее имя, по которому на директиву можно ссылаться в шаблоне:

@Directive({
  selector: '[dropZone]',
  exportAs: 'dropZone',
})
export class DropZone {
  /* ... */
}

Объявляя переменную шаблона для элемента, можно присвоить ей экземпляр директивы, указав это имя exportAs:

<!-- The `firstZone` variable refers to the `DropZone` directive instance. -->
<section dropZone #firstZone="dropZone">...</section>

Нельзя ссылаться на директиву, для которой не задано имя exportAs.

Использование переменных ссылок на шаблон с запросами

Переменные шаблона можно использовать не только для чтения значений из другой части того же шаблона, но и для «пометки» элемента для запросов компонентов и директив.

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

<input #description value="Original description" />
@Component({
  /* ... */,
  template: `<input #description value="Original description">`,
})
export class AppComponent {
  // Query for the input element based on the template variable name.
  @ViewChild('description') input: ElementRef | undefined;
}

Подробнее о запросах см. в разделе Ссылки на дочерние элементы с помощью запросов.

Область видимости переменных шаблона

Как и переменные в коде JavaScript или TypeScript, переменные шаблона доступны только в пределах шаблона, в котором они объявлены.

Аналогично, структурные директивы или объявления <ng-template> создают новую вложенную область видимости шаблона — подобно тому, как операторы управления потоком JavaScript, такие как if и for, создают новые лексические области видимости. Переменные шаблона внутри таких структурных директив недоступны за их пределами.

ПОЛЕЗНО: Объявляйте переменную в шаблоне только один раз, чтобы значение во время выполнения оставалось предсказуемым.

Доступ из вложенного шаблона

Внутренний шаблон может обращаться к переменным шаблона, объявленным во внешнем шаблоне.

В следующем примере изменение текста в <input> изменяет значение в <span>, поскольку Angular сразу же применяет изменения через переменную шаблона ref1.

<input #ref1 type="text" [(ngModel)]="firstExample" />

<span *ngIf="true">Value: {{ ref1.value }}</span>

В этом случае *ngIf для <span> создаёт новую область видимости шаблона, в которую входит переменная ref1 из родительской области видимости.

Однако обратиться к переменной шаблона из дочерней области видимости в родительском шаблоне не получится:

<input *ngIf="true" #ref2 type="text" [(ngModel)]="secondExample" />

<span>Value: {{ ref2?.value }}</span>

Здесь ref2 объявлена в дочерней области видимости, созданной с помощью *ngIf, и недоступна из родительского шаблона.

Super-powered by Google ©2010–2025.
Code licensed under an MIT-style License. Documentation licensed under CC BY 4.0.
https://angular.dev/guide/templates/variables

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API