我不完全理解我需要在哪里以及如何在 Angular 组件中声明可观察对象/主题。
目前,我开发了一个与 MovieDB API 交互的网站,并且一切正常,但同时我知道我的代码很糟糕,因为在销毁组件后没有清理订阅,但是要进行这些清理,我需要最不了解如何正确使用 RxJS。
我认为我的用法不正确,因为我在每次与页面交互时都有新订阅。另外据我了解,它们需要在构造函数中声明。
这个页面的想法是有一个输入表单,用户可以在其中输入查询并检查单选按钮以选择要搜索的内容:“电视”或“电影”。当有搜索结果时,会出现一个按钮来展开结果。
所以,这里是代码:
import {Component, OnDestroy} from '@angular/core';
import {ISearchParams} from '../../models/search-params.interface';
import {ShowService} from '../../services/show.service';
import {IResultsIds} from '../../models/results.interface';
import {distinctUntilChanged} from 'rxjs/operators';
import {Subscription} from 'rxjs';
@Component({
selector: 'app-search',
templateUrl: './search-tab.component.html',
styleUrls: ['./search-tab.component.scss']
})
export class SearchTabComponent implements OnDestroy {
searchParams!: ISearchParams;
searchResults!: IResultsIds;
searchSub!: Subscription;
showMoreSub!: Subscription;
constructor(private movieService: ShowService) {
}
search(searchParams: ISearchParams): void {
this.searchParams = searchParams;
this.searchSub = this.movieService.search(searchParams)
.pipe(distinctUntilChanged())
.subscribe(results => {
this.searchResults = results;
});
}
showMore(): void {
if (!this.isFinished()) {
this.searchParams.page++;
this.showMoreSub = this.movieService.search(this.searchParams)
.subscribe(results => {
this.searchResults!.ids.push(...results.ids);
});
}
}
isFinished = () => this.searchParams.page >= this.searchResults!.total_pages;
ngOnDestroy(): void {
// this.searchSub.unsubscribe();
// this.showMoreSub.unsubscribe();
}
}
和 HTML:
<main class="main-content search-container">
<app-search-form (searchParams)="search($event)"></app-search-form>
<div class="results" *ngIf="searchResults">
<app-show-description *ngFor="let id of searchResults.ids"
[showType]="searchParams.type"
[showId]="id"></app-show-description>
</div>
<button *ngIf="searchResults && !isFinished()"
(click)="showMore()"
class="load-btn more-btn">show more...</button>
</main>
如果你能帮助我并告诉我哪里出错了,我将不胜感激。在更多的时间里,一切都以这种方式工作,但我想了解 RxJS 的用法。
UPD @H3AR7B3A7 非常感谢你,你让我的知识有点清楚了!但现在我有另一个误解:如何将 2 个数组 observables 转换为一个?我用谷歌搜索,但找不到解决问题的方法:我有加载更多电影的功能 - 它必须扩展 distinctMovies$ 数组,它看起来就像一个数字(id)数组,但我不能加入两个数组,我得到的只是 [...], [...] 但不是 [......]
我试过这个:
showMore(): void {
this.searchParams.page++;
this.distinctMovies$ = concat(this.distinctMovies$,
this.movieService.search(this.searchParams)
.pipe(pluck('ids')))
.pipe(tap(console.log));
}