我看到每个人都在一个标签中同时使用 *ngFor 和 *ngIf 以及类似的解决方法,但我认为这是一种反模式。在大多数常规编码语言中,您不会在同一行上执行 if 语句和 for 循环,对吗?恕我直言,如果您必须解决问题,因为他们特别不希望您这样做,那么您不应该这样做。 不要实践非“最佳实践”。
✅✅✅ 保持简单,如果您不需要将来自 users$ | async 的 $implicit 值声明为用户:
<!-- readability is your friend -->
<div *ngIf="(users$ | async).length > 1"> ... </div>
但如果您确实需要声明 as user,请将其包装起来。
✅ 用于复杂用例;请注意,生成的标记甚至没有 HTML 标记,这就是 ng-templates 和 ng-containers 的美妙之处!
@alsami 接受、编辑的答案有效,因为带星号的 *ngFor 是带 ngFor(无星号)的 ng-template 的简写,更不用说双异步管道?。当您将无星号 ngFor 与 *ngIf; 结合使用时,代码确实闻起来不一致。你明白要点了。 *ngIf 具有优先权,那么为什么不将它包装在 ng-container/ng-template 中呢?它不会在生成的标记中使用 HTML 标记来包装您的内部元素。
<div *ngIf="users$ | async as prods; then thenB; else elseB"></div>
<ng-template #thenB>
<!-- inner logic -->
<div *ngIf="prods?.length > 1 && users?.length < 5; else noMatchB">
Loaded and inbound
</div>
<ng-template #noMatchB>Loaded and out of bound</ng-template>
</ng-template>
<ng-template #elseB>Content to render when condition is false.</ng-template>
❌不要这样做
<!-- Big NO NO -->
<div *ngIf="(users$ | async)?.length > 1 && (users$ | async)?.length < 5"> ... </div>
在您了解管道对生命周期的敏感性之后,它有点令人生畏;他们疯狂地更新。这就是 Angular 没有 SortPipe 和 FilterPipe 的原因。所以,呃,不要这样做;您基本上是在创建 2 个 Observable,它们有时会疯狂更新,如果我是正确的,可能会导致其子项中的长期数据不匹配。