Angular 使用主题和http客户端服务进行文本搜索时出现问题
我一直在使用keyup和Rxjs主题开发文本搜索 它搜索多个API并返回单个对象 在我清除文本字段之前,一切都正常,起初我得到了404,因为应用程序仍然使用空查询进行http调用 我可以通过检查字符串是否为空来抑制错误,但应用程序仍会以静默方式失败,这意味着:应用程序将不会更新、冻结 我在SearchComponent中设置了主题,并订阅了searchService中的搜索功能Angular 使用主题和http客户端服务进行文本搜索时出现问题,angular,rxjs,Angular,Rxjs,我一直在使用keyup和Rxjs主题开发文本搜索 它搜索多个API并返回单个对象 在我清除文本字段之前,一切都正常,起初我得到了404,因为应用程序仍然使用空查询进行http调用 我可以通过检查字符串是否为空来抑制错误,但应用程序仍会以静默方式失败,这意味着:应用程序将不会更新、冻结 我在SearchComponent中设置了主题,并订阅了searchService中的搜索功能 public searchStr = new Subject<string>(); constructo
public searchStr = new Subject<string>();
constructor(private searchService: SearchService) {
this.searchService.search(this.searchStr)
.subscribe((result)=> {
this.result = result;
this.movies = result[0];
this.games = result[1];
this.comics = result[2];
})
}
下面是一个API调用;它们都很相似
public searchMusic(query): Observable<any>{
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
return this.http.get(this.url+'/music/search/'+query, options)
.map((data) => {
let result;
result = data.json().data.albums.items;
return result;
})
.catch((error) => {
return Observable.throw(error)
})
}
公共搜索音乐(查询):可观察{
let headers=新的头({'Content-Type':'application/json'});
let options=newrequestoptions({headers:headers});
返回此.http.get(this.url+'/music/search/'+query,选项)
.map((数据)=>{
让结果;
result=data.json().data.albums.items;
返回结果;
})
.catch((错误)=>{
返回可观察抛出(错误)
})
}
我想知道其他人是如何处理这些问题的您的实现很好,但我建议在执行搜索操作之前添加min字符 我建议输入3个字符后开始搜索
<input (keyup)="searchStrFun($event.target.value)">
searchStrFun(input){
if(input.length > 2) {
searchStr.next(input)
}
}
搜索strfun(输入){
如果(input.length>2){
searchStr.next(输入)
}
}
到了冰天雪地的地方?任何控制台.log为什么不过滤空查询
public search(query: Observable<string>){
return query.debounceTime(400)
.distinctUntilChanged()
.filter(query => query.length > 0)
.switchMap(query => this.callSearches(query))
}
公共搜索(查询:可观察){
返回查询.去BounceTime(400)
.distinctUntilChanged()
.filter(query=>query.length>0)
.switchMap(查询=>this.callSearches(查询))
}
你所说的“但应用程序仍会无声地失败,意思是:应用程序不会更新、冻结”到底是什么意思?你期望的行为是什么?我期望;如果我从文本字段中删除所有文本,然后输入新文本,它应该执行一个新的搜索,但它什么也不做,从上次搜索到页面的任何输出仍然是sameThanks,可能冻结是使用错误的词,基本上我得到一个404错误,当我清除文本字段时,因为对API的调用仍在执行,然后,当我重新输入文本时,搜索拒绝工作。如果我在代码的各个部分检查字符串是否为空,则可以抑制错误,但是搜索仍然不起作用。如果字符串为空,则建议简单的不执行搜索操作。除此之外,您的实现是好的
public searchMusic(query): Observable<any>{
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
return this.http.get(this.url+'/music/search/'+query, options)
.map((data) => {
let result;
result = data.json().data.albums.items;
return result;
})
.catch((error) => {
return Observable.throw(error)
})
}
<input (keyup)="searchStrFun($event.target.value)">
searchStrFun(input){
if(input.length > 2) {
searchStr.next(input)
}
}
public search(query: Observable<string>){
return query.debounceTime(400)
.distinctUntilChanged()
.filter(query => query.length > 0)
.switchMap(query => this.callSearches(query))
}