5章:Creating Dynamic Angular Components
を読んだので調べたことをつらつらと書く
Angular一般
・keyof/typeof
typeは型,keyはkey-valueのkey
https://qiita.com/tak001/items/bec3ab7c1bb4df52a7e7
・パラメーターを渡す
<app-expense-modal [title]="'title'" [shown]=true>
<h2>hogehoge</h2>
</app-expense-modal>
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-expense-modal',
standalone: true,
imports: [CommonModule],
templateUrl: './expense-modal.component.html',
styleUrl: './expense-modal.component.css',
})
export class ExpenseModalComponent {
@Input({ required: true }) title = '';
@Input({ required: true }) shown = true;
@Output() shownChange = new EventEmitter<boolean>();
}
・ViewChildren
テンプレートの要素を取得する時に使う
https://tkzo.jp/blog/angular6-view-child-content-child/#ContentChild-2
ng-container/ng-template
・ng-containerに要素を出す
https://qiita.com/ukyo/items/0e44f5f562335fd6601b
<app-expense-modal [title]="'title'" [shown]=true>
<h2 header-content>hogehoge</h2>
</app-expense-modal>
<!-- header-contentのディレクティブを表示する -->
<!-- h2タグがここに表示される -->
<ng-content select="[header-content]"></ng-content>
・ngTemplateOutlet
https://ryuzan03.hatenablog.com/entry/2020/04/10/184845
mobileならA->B->CD
!mobileならCD->B->A
になる
<ng-container *ngIf="isMobile" [ngTemplateOutlet]="A"></ng-container> <ng-container *ngIf="!isMobile" [ngTemplateOutlet]="CD"></ng-container> <div>block B</div> <ng-container *ngIf="!isMobile" [ngTemplateOutlet]="A"></ng-container> <ng-container *ngIf="isMobile" [ngTemplateOutlet]="CD"></ng-container> <ng-template #A> <div>A</div> </ng-template> <ng-template #CD> <div>CD</div> </ng-template>
・ngTemplateOutletContext
$implicitで、let-hogehogeにパラメーターを渡せる
https://ryuzan03.hatenablog.com/entry/2020/04/10/184845#implicit
<ng-container [ngTemplateOutlet]="optionTemplate || defaultTemplate" [ngTemplateOutletContext]="{ $implicit: option}"></ng-container>
<ng-template #defaultTemplate let-option>
{{ labelKey ? option[labelKey] : option}}
</ng-template>
・ngComponentOutlet
コンポーネントを表示する
https://qiita.com/ksh-fthr/items/212fe3a1c0308b1fd782
<ng-container *ngComponentOutlet="currentTab"></ng-container>
・テンプレート変数
<p #exampleVar>expenses-overview-page works!</p>
<div>Template var says:{{exampleVar.innerHTML}}</div>
・if-else
<div *ngIf="expense">....</div> <div *ngIf="!expense">Loading...</div> <!-- elseのときはloadingがテンプレート変数となりng-templateが呼ばれる --> <div *ngIf="expense else loading">...</div> <ng-template #loading> <div>loading...2</div> </ng-template>
・DI
https://zenn.dev/lacolaco/books/angular-standalone-components/viewer/dependency-injection
export interface WeatherWidgetData {
city: string;
message: string;
}
export const WEATHERWIDGET = new InjectionToken<WeatherWidgetData>(
'weatherwidgets'
);
//providerに以下を設定
{
provide: WEATHERWIDGET,
useValue: {
city: 'Amsterdam',
message: 'Sunny',
},
}
//以下でデータを取得
constructor(@Inject(WEATHERWIDGET) a: WeatherWidgetData) {
console.log(a);
}
・ng-contaienrにデータを渡す
widgetInputs = {
city: 'Amsterdam',
message: 'Sunny',
};
<ng-container *ngComponentOutlet="widget.component;inputs: widgetInputs;" ></ng-container>