Хост-элементы компонентов
СОВЕТ: В этом руководстве предполагается, что вы уже прочитали руководство по основам. Если вы только начинаете работать с Angular, сначала прочитайте его.
Angular создаёт экземпляр компонента для каждого HTML-элемента, соответствующего селектору компонента. DOM-элемент, соответствующий селектору компонента, является хост-элементом этого компонента. Содержимое шаблона компонента отображается внутри его хост-элемента.
// Component source
@Component({
selector: 'profile-photo',
template: `<img src="profile-photo.jpg" alt="Your profile photo" />`,
})
export class ProfilePhoto {}
<!-- Using the component --> <h3>Your profile photo</h3> <profile-photo /> <button>Upload a new profile photo</button>
<!-- Rendered DOM --> <h3>Your profile photo</h3> <profile-photo> <img src="profile-photo.jpg" alt="Your profile photo" /> </profile-photo> <button>Upload a new profile photo</button>
В приведённом выше примере <profile-photo> — это хост-элемент компонента ProfilePhoto.
Привязка к хост-элементу
Компонент может привязывать свойства, атрибуты, стили и события к своему хост-элементу. Это работает так же, как привязки к элементам внутри шаблона компонента, но задаётся с помощью свойства host в декораторе @Component:
@Component({
...,
host: {
'role': 'slider',
'[attr.aria-valuenow]': 'value',
'[class.active]': 'isActive()',
'[style.background]' : `hasError() ? 'red' : 'green'`,
'[tabIndex]': 'disabled ? -1 : 0',
'(keydown)': 'updateValue($event)',
},
})
export class CustomSlider {
value: number = 0;
disabled: boolean = false;
isActive = signal(false);
hasError = signal(false);
updateValue(event: KeyboardEvent) { /* ... */ }
/* ... */
}
ПРИМЕЧАНИЕ: Глобальные целевые объекты, которые можно указать перед именем события, — это document:, window: и body:.
Декораторы @HostBinding и @HostListener
Также можно привязываться к хост-элементу, применив декораторы @HostBinding и @HostListener к членам класса.
@HostBinding позволяет привязывать свойства и атрибуты хоста к свойствам и геттерам:
@Component({
/* ... */
})
export class CustomSlider {
@HostBinding('attr.aria-valuenow')
value: number = 0;
@HostBinding('tabIndex')
get tabIndex() {
return this.disabled ? -1 : 0;
}
/* ... */
}
@HostListener позволяет привязывать обработчики событий к хост-элементу. Декоратор принимает имя события и необязательный массив аргументов:
export class CustomSlider {
@HostListener('keydown', ['$event'])
updateValue(event: KeyboardEvent) {
/* ... */
}
} Предпочитайте свойство host декораторам
Всегда предпочитайте свойство host декораторам @HostBinding и @HostListener. Эти декораторы существуют исключительно для обеспечения обратной совместимости.
Конфликты привязок
При использовании компонента в шаблоне можно добавлять привязки к элементу экземпляра этого компонента. Компонент также может определять привязки хоста для тех же свойств или атрибутов.
@Component({
...,
host: {
'role': 'presentation',
'[id]': 'id',
}
})
export class ProfilePhoto { /* ... */ }
<profile-photo role="group" [id]="otherId" />
В подобных случаях приоритет значений определяется следующими правилами:
- Если оба значения статические, приоритет имеет привязка экземпляра.
- Если одно значение статическое, а другое динамическое, приоритет имеет динамическое значение.
- Если оба значения динамические, приоритет имеет привязка хоста компонента.
Стилизация с помощью пользовательских свойств CSS
Разработчики часто используют пользовательские свойства CSS, чтобы обеспечить гибкую настройку стилей компонентов. Такие пользовательские свойства можно задать для хост-элемента с помощью привязки стиля.
@Component({
/* ... */
host: {
'[style.--my-background]': 'color()',
},
})
export class MyComponent {
color = signal('lightgreen');
}
В этом примере пользовательское свойство CSS --my-background привязано к сигналу color. Значение пользовательского свойства будет автоматически обновляться при каждом изменении сигнала color. Это повлияет на текущий компонент и все его дочерние компоненты, которые используют это пользовательское свойство.
Задание пользовательских свойств для дочерних компонентов
Также пользовательские свойства CSS можно задать для хост-элемента дочерних компонентов с помощью привязки стиля.
@Component({
selector: 'my-component',
template: `<my-child [style.--my-background]="color()" />`,
})
export class MyComponent {
color = signal('lightgreen');
} Внедрение атрибутов хост-элемента
Компоненты и директивы могут считывать статические атрибуты своего хост-элемента с помощью HostAttributeToken и функции inject.
import { Component, HostAttributeToken, inject } from '@angular/core';
@Component({
selector: 'app-button',
...,
})
export class Button {
variation = inject(new HostAttributeToken('variation'));
}
<app-button variation="primary">Click me</app-button>
ПОЛЕЗНО ЗНАТЬ: HostAttributeToken выдаёт ошибку, если атрибут отсутствует, кроме случаев, когда внедрение помечено как необязательное.
Super-powered by Google ©2010–2025.
Code licensed under an MIT-style License. Documentation licensed under CC BY 4.0.
https://angular.dev/guide/components/host-elements