ngIf with condition 丢失原始对象以进行 let 绑定;使用异步管道
ngIf with condition loses original object for let binding; with async pipe
假设我像这样跟踪当前登录的用户。如果用户为空,则他们未登录。如果已登录,则他们要么是匿名的(没有名字),要么不是。
interface User {
name?: string;
}
currentUser$: Observable<User>;
现在假设我想在用户不是匿名用户时显示一些内容,就像这样...
<div *ngIf="(this.currentUser$ | async)?.name != null; let user">
Hello {{user.name}}
</div>
这不起作用,因为 user
变量绑定到布尔值,而不是异步管道中的原始用户。同样,我不能使用 *ngIf 来查找登录用户 - 匿名与否 - 因为一旦我 运行 条件 (this.currentUser$ | async) != null; let user
我就不再有权访问要在模板中使用的用户对象.
我试过这样的东西...
<ng-container *ngIf="this.currentUser$ | async; let user">
<div *ngIf="user === 'none'">Need to sign in</div>
<div *ngIf="user !== 'none' && user.name==null">Hi stranger</div>
<div *ngIf="user !== 'none' && user.name!=null">Hi {{user.name}}</div>
</ng-container>
但这也不管用。首先,我需要将我的可观察对象转换为 null
与其他内容交换的对象,例如 -1 或字符串 none
,因为我很确定 *ngIf 将 return错误的。然后 user.name==null
部分将无法编译,因为 Angular 仍然认为该变量是一个 User | 'none',不仅仅是一个用户。我无法弄清楚如何转换它以使错误消失。
我认为我可以通过订阅组件中的可观察对象、将当前用户详细信息存储为一两个变量,然后在模板中使用 {{currentUser}}
来完成大部分我想做的事情。这是一堆额外的工作,我需要记得退订。有点打败异步管道的酷。
我在这里错过了什么?我来自 asp.net Razor 背景,您可以在模板中定义临时变量,我想我想在这里做类似的事情。
两件事:首先从您的 html 中删除 this
,这不是必需的。
其次,你可以这样做:(this.currentUser$ | async) as user
<div *ngIf="(this.currentUser$ | async) as user">
<span *ngIf="user.name">Hello {{user.name}}</span>
</div>
假设我像这样跟踪当前登录的用户。如果用户为空,则他们未登录。如果已登录,则他们要么是匿名的(没有名字),要么不是。
interface User {
name?: string;
}
currentUser$: Observable<User>;
现在假设我想在用户不是匿名用户时显示一些内容,就像这样...
<div *ngIf="(this.currentUser$ | async)?.name != null; let user">
Hello {{user.name}}
</div>
这不起作用,因为 user
变量绑定到布尔值,而不是异步管道中的原始用户。同样,我不能使用 *ngIf 来查找登录用户 - 匿名与否 - 因为一旦我 运行 条件 (this.currentUser$ | async) != null; let user
我就不再有权访问要在模板中使用的用户对象.
我试过这样的东西...
<ng-container *ngIf="this.currentUser$ | async; let user">
<div *ngIf="user === 'none'">Need to sign in</div>
<div *ngIf="user !== 'none' && user.name==null">Hi stranger</div>
<div *ngIf="user !== 'none' && user.name!=null">Hi {{user.name}}</div>
</ng-container>
但这也不管用。首先,我需要将我的可观察对象转换为 null
与其他内容交换的对象,例如 -1 或字符串 none
,因为我很确定 *ngIf 将 return错误的。然后 user.name==null
部分将无法编译,因为 Angular 仍然认为该变量是一个 User | 'none',不仅仅是一个用户。我无法弄清楚如何转换它以使错误消失。
我认为我可以通过订阅组件中的可观察对象、将当前用户详细信息存储为一两个变量,然后在模板中使用 {{currentUser}}
来完成大部分我想做的事情。这是一堆额外的工作,我需要记得退订。有点打败异步管道的酷。
我在这里错过了什么?我来自 asp.net Razor 背景,您可以在模板中定义临时变量,我想我想在这里做类似的事情。
两件事:首先从您的 html 中删除 this
,这不是必需的。
其次,你可以这样做:(this.currentUser$ | async) as user
<div *ngIf="(this.currentUser$ | async) as user">
<span *ngIf="user.name">Hello {{user.name}}</span>
</div>