typescript - Parametrii interogării Angular ca tip boolean, nu string
Aș dori să transmit un parametru de interogare unui *ngIf, dar acesta continuă să fie evaluat ca adevărat deoarece este de tip șir. Cum pot să schimb parametrul meu de interogare într-un boolean pentru a fi evaluat ca fals?
Parametrul de interogare este ?paywall=true, dar este încă adevărat cu interogarea ?paywall=false
component.ts
ngOnInit() {
this.paywallQuery$ = this.route.queryParamMap.pipe(map(params => params.get('paywall')));
}
component.html
<div *ngIf="(paywallQuery$ | async)"> <-- always evaluates as true
</div>
Răspuns #1
Mapează valoarea la un boolean prin efectuarea unei comparații de șiruri cu 'true'.
ngOnInit() {
this.paywallQuery$ = this.route.queryParamMap.pipe(
map(params => {
const value = params.get('paywall');
return value ? value.toLocaleLowerCase() === 'true' : false;
})
);
}
Răspunsul #2
Dacă deja depind de CDK-ul Angular, aș folosi funcția de coercare booleană (coerceBooleanProperty) pentru a converti acel șir într-un boolean corespunzător.
Este destul de simplu, dar asta e problema cu URL-urile și atributele în spațiul componentelor web față de folosirea JavaScript pentru a face legătura. queryparams, pathparams și attributes sunt toate valori de tip string, așa că trebuie să le convertești ca să aibă sens în implementarea ta.
Acesta ar fi codul meu:
import { coerceBooleanProperty } from '@angular/cdk/coercion';
this.paywallQuery = coerceBooleanProperty(this.route.snapshot.paramMap.get('paywall'))
și poți vedea câteva exemple aici: https://github.com/angular/components/blob/master/src/cdk/coercion/boolean-property.spec.ts
