typescript - Angular 13 asynkron datahämtning
När jag visar ett verktygstips-felmeddelande i HTML får jag följande fel:
"Typen 'unknown' kan inte tilldelas typen 'string'. ngtsc(2322)"
Skärmdump
TypeScript-kod
export class ValidationErrorComponent implements OnInit {
@Input() control!: FormControl;
@Input() customErrors: ErrorType = {};
error$: any;
constructor(public errorStateMatcher: ErrorStateMatcher) {}
ngOnInit() {
const setError = (ctrl: any) => {
let errorStr = '';
Object.entries(ctrl).map(([error, value]: any) => {
let getError = this.customErrors[error] || FORM_ERRORS[error];
if (getError != undefined) {
errorStr += `• ${getError(value)}.\n`;
}
});
return errorStr;
};
this.error$ = this.control.statusChanges.pipe(
tap(console.log),
startWith({}),
map((value) => setError(this.control.errors || {}))
);
}
}
och det här är min html-kod
<mat-icon *ngIf="errorStateMatcher.isErrorState(control, null) && (error$) | async as error " color="warn"
[matTooltip]=error matTooltipClass="tool-tip">
error_outline
</mat-icon>
Felmeddelanden bör visas asynkront. Vänligen hjälp till att lösa detta fel.
Svar #1
Skapa en variabel för att lagra felmeddelandet som sätts till mat-verktygsstips
ts
export class ValidationErrorComponent implements OnInit {
@Input() control!: FormControl;
@Input() customErrors: ErrorType = {};
error$: any;
error : string;
constructor(public errorStateMatcher: ErrorStateMatcher) {}
ngOnInit() {
const setError = (ctrl: any) => {
let errorStr = '';
Object.entries(ctrl).map(([error, value]: any) => {
let getError = this.customErrors[error] || FORM_ERRORS[error];
if (getError != undefined) {
errorStr += `• ${getError(value)}.\n`;
}
});
return errorStr;
};
this.error$ = this.control.statusChanges.pipe(
startWith({}),
tap((value) => this.error = setError(this.control.errors || {}))
);
}
}
html
<mat-icon *ngIf="errorStateMatcher.isErrorState(control, null) && error" color="warn" [matTooltip]="error" matTooltipClass="tool-tip">
Svar #2
Problemet orsakas av det faktum att din error-variabel i mallen är av typen unknown, medan attributbindningen [matToolTip] förväntar sig en string.
Kan du försöka skriva din error$ observerbara enligt följande:
export class ValidationErrorComponent implements OnInit {
@Input() control!: FormControl;
@Input() customErrors: ErrorType = {};
error$: Observable<string>;
constructor(public errorStateMatcher: ErrorStateMatcher) {}
ngOnInit() {
const setError = (ctrl: any) => {
let errorStr = '';
Object.entries(ctrl).map(([error, value]: any) => {
let getError = this.customErrors[error] || FORM_ERRORS[error];
if (getError != undefined) {
errorStr += `• ${getError(value)}.\n`;
}
});
return errorStr;
};
this.error$ = this.control.statusChanges.pipe(
tap(console.log),
startWith({}),
map((value) => setError(this.control.errors || {}))
);
}
}
Jag tror också att du har parenteserna felplacerade runt din async-sats i din mall. Vänligen uppdatera till:
<mat-icon *ngIf="errorStateMatcher.isErrorState(control, null) && (error$ | async as error) " color="warn"
[matTooltip]=error matTooltipClass="tool-tip">
error_outline
</mat-icon>
