【发布时间】:2019-01-29 03:48:00
【问题描述】:
我有一个快速搜索框,我想要一个加载动画。我使用ng-template 和ngIf 来显示/隐藏这个动画。我有一些 li 嵌套在同一个 div 中,该 div 使用异步管道订阅搜索结果 Observable 来显示结果。当父 div 上没有 *ngIf 时,此异步管道效果很好,但当我应用 ngIf 时,它似乎不再订阅。这是预期的行为吗?还是我做错了什么?
我的标记看起来像这样。
<input #searchBox type="text" (keyup)="itemLoading=true;searchTerm$.next(searchBox.value)"/>
<div *ngIf="!itemLoading else loading">
<!--Remove ngIf then items will display correctly when search-->
<!-- <div> -->
<ul>
<li *ngFor="let item of result$ | async ">{{item}}</li>
</ul>
</div>
<ng-template #loading>
<p>LOADING...</p>
</ng-template>
我正在使用 switchMap 来运行搜索:
private source = of(['apple', 'pear', 'banana']).pipe(delay(500));
searchTerm$ = new Subject<string>();
result$: Observable<string[]>;
itemLoading = false;
constructor() {
this.result$ = this.searchTerm$.pipe(
tap(term => console.log('search term captured: ' + term)),
debounceTime(300),
distinctUntilChanged(),
switchMap(() => this.source.pipe(
tap(_ => {
console.log('source reached');
this.itemLoading = false;
})
))
);
}
当 ngIf 出现在父 div 中时,“到达源”消息永远不会登录到控制台,并且加载模板一直挂在那里。
这是我正在谈论的完整工作示例:https://stackblitz.com/edit/angular-2ukcqu
【问题讨论】:
标签: javascript angular typescript rxjs angular6