# コンポーネントのホスト要素 **ホスト要素**とは、コンポーネントのセレクターに一致するDOM要素です。コンポーネントのテンプレートはこの要素の内部にレンダリングされます。 ## ホスト要素へのバインディング `@Component` デコレーターの `host` プロパティを使用して、プロパティ、属性、スタイル、イベントをホスト要素にバインドします。これはレガシーデコレーターより**推奨されるアプローチ**です。 ```ts @Component({ selector: 'custom-slider', host: { 'role': 'slider', // 静的属性 '[attr.aria-valuenow]': 'value', // 属性バインディング '[class.active]': 'isActive()', // クラスバインディング '[style.color]': 'color()', // スタイルバインディング '[tabIndex]': 'disabled ? -1 : 0', // プロパティバインディング '(keydown)': 'onKeyDown($event)', // イベントバインディング }, }) export class CustomSlider { value = 0; disabled = false; isActive = signal(false); color = signal('blue'); onKeyDown(event: KeyboardEvent) { /* ... */ } } ``` ## レガシーデコレーター `@HostBinding` と `@HostListener` は後方互換性のためにサポートされていますが、新しいコードでは使用を避けてください。 ```ts export class CustomSlider { @HostBinding('tabIndex') get tabIndex() { return this.disabled ? -1 : 0; } @HostListener('keydown', ['$event']) onKeyDown(event: KeyboardEvent) { /* ... */ } } ``` ## バインディングの競合 コンポーネント(ホストバインディング)とコンシューマー(テンプレートバインディング)の両方が同じプロパティにバインドする場合: 1. **静的 vs 静的**: インスタンス(コンシューマー)のバインディングが優先されます。 2. **静的 vs 動的**: 動的バインディングが優先されます。 3. **動的 vs 動的**: コンポーネントのホストバインディングが優先されます。 ## ホスト属性のインジェクト `inject` 関数と `HostAttributeToken` を使用して、構築時にホスト要素から静的属性を読み取ります。 ```ts import {Component, HostAttributeToken, inject} from '@angular/core'; @Component({ selector: 'app-btn', template: ``, }) export class AppButton { // `{ optional: true }` でインジェクトしない限り、'type'がない場合エラーをスローします type = inject(new HostAttributeToken('type')); } ``` 使用例: ```html Click Me ```