angular - RxJs, Angular4+
问题描述
我有一个film
对象,它有一个genre
属性。我想在运行时在自定义下拉菜单中按类型获取电影FormControl
。
所以我定义new BehaviourSubject(<int>) genre
,如果它会在运行时改变,在ngOnChanges()
方法中获取值。之后它命中 API。但我想在此之前检查流派值。例如,如果genre.getValue = 0
不调用 API。
示例代码如下。如何检查价值?
private _genre;
private selectedGenre = new BehaviorSubject(0);
@Input()
set genre(value: any) {
this._genre = value;
this.selectedGenre.next(this._genre);
}
films: any[];
ngOnInit() {
this.selectedGenre.distinctUntilChanged().combineLatest(
this.selectedGenre.distinctUntilChanged(), (_genre) => {
return {
genre: _genre
}
}
)
.switchMap(t => this.service.getFilmsByGenre(genre))
.subscribe(result => {
if (result) this.films = result;
});
}
ngOnChanges(changes: { [propName: string]: SimpleChange }) {
if (changes['genre']) {
this.films = null;
this.filmCtrl.setValue(null);
this.selectedGenre.next(changes['genre'].currentValue || 0);
}
}
解决方案
您可以使用过滤器仅订阅那些您需要调用 API 的值。
this.selectedGenre.distinctUntilChanged().combineLatest(
this.selectedGenre.distinctUntilChanged(), (_genre) => {
return {
genre: _genre
}
}
)
.filter(genre=>genre.getValue!==0)
.switchMap(genre => this.service.getFilmsByGenre(genre))
.subscribe(result => {
if (result) this.films = result;
});
推荐阅读
- laravel - Laravel 主动发货方式
- wiremock - 使用证书的 Wiremock 在 Windows 上不起作用
- sql - 如何根据单个表中的两个列值获取 1 条记录?
- python - 用于具有 DistributionLambda 层的 TFServing 的 TensorFlow 自定义模型签名
- swift - AVCaptureConnection.previewLayer 在委托 AVCaptureMetadataOutputObjectsDelegate 中为零
- java - 查找空的日历日期空档
- asp.net - 在 iis 或 asp 项目中限制 URL 级别的内容长度
- mongodb - Groovy:从 groovy 中根据 mongodb 中的日期范围搜索数据
- c# - 从 png 字节获取 EMGU 图像
- c++ - 将 IPv4 地址转换为 std::array of bytes 时出现错误的符号转换