typescript - Angular material-dialog - pass typer inn i dialogkomponent
Jeg jobber med en datadrevet app og står for øyeblikket overfor et problem med å sende typer inn i Material Angular-dialog. Jeg vil lage et gjenbrukbart dialogskjema og trenger å endre typer for en ny dialoginstans.
Finnes det en måte å sende type inn i materialdialog eller inn i komponent? Eller kanskje det er mulig å lage typer i dialogen selv fra streng sendt som data?
Jeg vil bruke typer i dialogkomponenten slik som dette (eller lignende):
export class DialogDynamicItemManagerDialog<T> {
public dialogName: string;
public items: Array<T>;
public selectedItem: T;
...
}
Jeg har prøvd å sende typen på denne måten:
OpenDynamicDialog(): void {
this.dialog.open(DialogDynamicItemManagerDialog<MyType>, {
data: {
title: 'Manage items',
items: this.items
},
});
}
men det fungerer åpenbart ikke.
Jeg har også prøvd dette:
OpenDynamicDialog(): void {
const dialogRef = this.dialog.open(DialogDynamicItemManagerDialog, {
data: {
title: 'Manage items',
items: this.items,
itemType: itemType
},
});
}
men jeg har ikke funnet en måte å endre streng til type i dialogen etterpå.
Svar #1
TL;DR:
Du kan bruke følgende kode for å spesifisere typen som dialogens data vil bruke:
import { MatDialog } from '@angular/material/dialog';
export class MyComponent {
constructor(private dialog: MatDialog) { }
openDialog() {
this.dialog.open<MyDialogComponent, MyType>(MyDialogComponent, {
data: {
// Your data goes here
}
};
}
}
I dialogkomponenten din:
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
export class MyDialogComponent {
constructor(@Inject(MAT_DIALOG_DATA) public data: MyType) { }
}
Metoden open i MatDialog-klassen tillater faktisk at tre typer spesifiseres (i rekkefølge):
T: Komponentklassen (valgfri - selv om det ikke finnes noen standardverdi, trenger du ikke spesifisere den hvis du bare kaller metoden uten andre typer)D: Typen som skal brukes for dataene som skal legges til dialogen (valgfritt - standard erany)R: Typen som skal brukes for resultatet av dialogen (valgfritt - standard erany)
Metoden er definert som nedenfor:
/**
* Opens a modal dialog containing the given component.
* @param componentOrTemplateRef Type of the component to load into the dialog,
* or a TemplateRef to instantiate as the dialog content.
* @param config Extra configuration options.
* @returns Reference to the newly-opened dialog.
*/
open<T, D = any, R = any>(componentOrTemplateRef: ComponentType<T> | TemplateRef<T>,
config?: MatDialogConfig<D>): MatDialogRef<T, R> {
// ...
}
Deretter blir D-typen sendt til MatDialogConfig, som godtar samme type for å brukes for dataene som skal sendes inn i dialogen.
Referanser:
MatDialog#openkildekode - legg merke til hvordan typene blir sendt rundt i koden!MatDialogConfigkildekode - legg merke til hvordan klassen er definert!
