Angular 可观测的never触发器上的角度开关映射
我想实现一个搜索组件,就像在Angular教程中一样 问题:Angular 可观测的never触发器上的角度开关映射,angular,observable,Angular,Observable,我想实现一个搜索组件,就像在Angular教程中一样 问题: search方法触发并修改searchTerms:Subject,但switchMap从不触发 代码: 导入 import { Component, OnInit } from '@angular/core'; import { SearchService } from "./search.service"; import { Observable } from 'rxjs/Observable'; import {
search
方法触发并修改searchTerms:Subject
,但switchMap
从不触发
代码:
导入
import { Component, OnInit } from '@angular/core';
import { SearchService } from "./search.service";
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';
// Observable class extensions
import 'rxjs/add/observable/of';
// Observable operators
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/debounceTime';
import 'rxjs/add/operator/distinctUntilChanged';
import {Suggest} from "./suggest";
装饰师
@Component({
selector: 'search-engine',
templateUrl: 'search-engine.component.html'
})
组件
export class SearchEngineComponent implements OnInit {
suggestions: Observable<Suggest[]>;
private searchTerms = new Subject<string>();
constructor(private searchService: SearchService) { }
ngOnInit(): void {
this.suggestions = this.searchTerms
.debounceTime(300)
.distinctUntilChanged()
.switchMap(term => {
console.log(term);
return Observable.of<Suggest[]>([]);
})
.catch(error => {
console.log(error);
return Observable.of<Suggest[]>([]);
});
}
search(term: string): void {
this.searchTerms.next(term);
}
}
导出类SearchEngineComponent实现OnInit{
建议:可见;
private searchTerms=新主题();
构造函数(私有搜索服务:搜索服务){}
ngOnInit():void{
this.advisions=this.searchTerms
.debounceTime(300)
.distinctUntilChanged()
.switchMap(术语=>{
控制台日志(术语);
([])的可观测收益率;
})
.catch(错误=>{
console.log(错误);
([])的可观测收益率;
});
}
搜索(术语:字符串):无效{
this.searchTerms.next(术语);
}
}
HTML
<input #searchBox id="search-box" (keyup)="search(searchBox.value)">
你必须订阅可观察的,如果你不订阅,什么也不会发生 编辑: 还有另一种情况,您可以在视图中声明和观察,并通过
async
管道隐式订阅,这就是这里发生的情况:
<div id="search-component">
<h4>Hero Search</h4>
<input #searchBox id="search-box" (keyup)="search(searchBox.value)" />
<div>
<div *ngFor="let hero of heroes | async"
(click)="gotoDetail(hero)" class="search-result" >
{{hero.name}}
</div>
</div>
</div>
英雄搜寻
{{hero.name}
关于
async
管道的更多信息您必须订阅可观察的,如果您不订阅,则不会发生任何事情
编辑:
还有另一种情况,您可以在视图中声明和观察,并通过async
管道隐式订阅,这就是这里发生的情况:
<div id="search-component">
<h4>Hero Search</h4>
<input #searchBox id="search-box" (keyup)="search(searchBox.value)" />
<div>
<div *ngFor="let hero of heroes | async"
(click)="gotoDetail(hero)" class="search-result" >
{{hero.name}}
</div>
</div>
</div>
英雄搜寻
{{hero.name}
关于
async
管道的更多信息我同意你的看法。但是在教程中:我没有发现我们在哪里订阅可观察的。。你能告诉我怎么做吗?你救了我,谢谢:)所以如果我没有带*| async*的HTML模板,我必须在.switchMap和.catch之间添加.subscribe(//do something)。是吗?不是,就在接球之后。你不能在subscribe()
之后链接更多的操作符。你把放在哪里。subscribe
我认为并不重要,尽管我总是把它放在switchMap
之后。我建议您将.filter
放在开关映射
之前,以检查术语
是否为空或验证您的条件。我同意您的看法。但是在教程中:我没有发现我们在哪里订阅可观察的。。你能告诉我怎么做吗?你救了我,谢谢:)所以如果我没有带*| async*的HTML模板,我必须在.switchMap和.catch之间添加.subscribe(//do something)。是吗?不是,就在接球之后。你不能在subscribe()
之后链接更多的操作符。你把放在哪里。subscribe
我认为并不重要,尽管我总是把它放在switchMap
之后。我建议您将.filter
放在switchMap
之前,以检查term
是否为空或验证您的条件。