我在 Angular 组件上有以下可观察的内容:
count$: Observable<number>;
this.count$ = this.getCount();
通过使用以下内容,我得到值 0(零);
this.count$.subscribe(x => console.log(x));
我的模板上有:
<a routerLink="/dash" *ngIf="(count$ | async)">
<ng-container *ngIf="count$ | async as count">
Count: {{count}}
</ng-container>
</a>
如果
count$
为 1,我会得到 Count: 1
,但如果 count$
为 0,则内容 Count: 0
甚至不会呈现。
知道为什么吗?
如果有人正在寻找解决方法,这很愚蠢,但它有效:
<ng-container *ngIf="{ len: count$ | async } as ctx">
<ng-container *ngIf="ctx.len !== null"
{{ ctx.len }}
</ng-container>
</ng-container>
说明:
count
捕获为名为 len
的对象内的
ctx
*ngIf
现在正在查看一个对象,而不是值,它将评估为 true 并渲染 ng-container
ctx.len !== null
ctx.len
您正在使用 ngIf,意味着您正在对您的值进行条件显示。当值为 0 时,您的条件评估为 false,因此不会显示。
在这些情况下:
if (false)
if (null)
if (undefined)
if (0)
if (NaN)
if ('')
if ("")
if (``)
上面说的这些都是假的,这是我的建议: 通过使用 pipe(map()) 将其转换为字符串,这样 '0' 就不是假的,它仍然可以与数字管道等一起使用。
希望这对其他人有帮助。
@Jota.toledo 答案是正确的,
*ngIf
将 0 视为虚假值并且不渲染它。LetDirective
作为解决方法。
import { LetDirective } from '@ngrx/component';
<a routerLink="/dash" *ngrxLet="count$ | async as count">
Count: {{count}}
</a>
从 Angular 18.1 开始,你还可以使用 @let
@let count = count$ | async;
<a routerLink="/dash" *ngIf="count != null">
Count: {{count}}
</a>