Angular 5:使用异步管道搜索 - 显示加载指示器

Posted

技术标签:

【中文标题】Angular 5:使用异步管道搜索 - 显示加载指示器【英文标题】:Angular 5: Search with Async Pipe - show loading indicator 【发布时间】:2018-09-11 13:11:11 【问题描述】:

我正在 Anglur 5 中实现一个带有async 的搜索字段。当用户开始在搜索框中输入内容时,应该会显示加载指示符。并且当结果到达时,指示器应该被隐藏。

我试过这个approach,但加载指示器是可见的,即使用户没有输入任何内容。 那么实现这一点的最佳方法是什么?

我的模板:

<mdl-textfield #searchBox (keyup)="search(searchBox.value)" type="text" placeholder="Nach Kurs, Beteuer, Studiengruppe suchen..."></mdl-textfield>
<!--[...]-->
<div *ngIf="courses$ | async as courses">
  <ng-container *ngIf="courses.length; else noItems">
      <app-course *ngFor="let course of courses" [course]="course" [addAble]="true"></app-course>
  </ng-container>
  <ng-template #noItems><em>Kein Ergebniss für "searchBox.value"</em></ng-template>
</div>

组件:

public courses$: Observable<Course[]>;
public searchCourseTerm = new Subject<string>();
public serachLoadingIndicator: boolean = false;

constructor(private courseService: CourseService)  

gOnInit() 
  this.courses$ = this.searchCourseTerm.pipe(
    debounceTime(300),
    distinctUntilChanged(),
    switchMap((term: string) => this.courseService.searchCourse(term)),
  );


search(term: string )
  this.searchCourseTerm.next(term);

【问题讨论】:

【参考方案1】:
ngOnInit() 
  this.courses$ = this.searchCourseTerm.pipe(
    debounceTime(300),
    distinctUntilChanged(),
    tap(() => this.searching = true)
    switchMap((term: string) => this.courseService.searchCourse(term)),
    tap(() => this.searching = false)
  );

应该可以解决问题。

【讨论】:

更像finalize(() =&gt; this.searching = false) 用空列表替换错误可能很危险,具体取决于上下文。假设您正在开发医疗保健软件并加载患者过敏症。如果请求失败,则向用户显示一个空列表,他们将其解释为没有过敏症的患者。您需要设计适合您的软件的错误处理策略。

以上是关于Angular 5:使用异步管道搜索 - 显示加载指示器的主要内容,如果未能解决你的问题,请参考以下文章

如何检查数据是不是已完成加载以使用异步管道 Angular 8

嵌套在 ngIf 中时,异步管道订阅无法正常工作

Ionic 4 Angular模板与异步管道绑定到可观察

尝试在我当前的 Angular 应用程序中使用异步管道而不是订阅

Angular *ngFor 使用异步管道绑定到 observable - 发生了啥?

加载数据后设置反应形式(异步) - Angular 5