gpt4 book ai didi

angular - 如何处理 rxjs 和 angular 5 中的 Observables,bootstrap typeahead 实现的问题

转载 作者:太空狗 更新时间:2023-10-29 19:32:19 30 4
gpt4 key购买 nike

我正在尝试在 Angular 5 中实现自动完成(bootstrap typeahead)。

经过几次代码重构后,这是我迄今为止最好的结果。但是在发出新值(在输入中键入新术语)后,它出现了这个错误......

TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
at Object.subscribeToResult (subscribeToResult.js:74)
at SwitchMapSubscriber.push../node_modules/rxjs/operators/switchMap.js.SwitchMapSubscriber._innerSub (switchMap.js:103)
at SwitchMapSubscriber.push../node_modules/rxjs/operators/switchMap.js.SwitchMapSubscriber._next (switchMap.js:96)
at SwitchMapSubscriber.push../node_modules/rxjs/Subscriber.js.Subscriber.next (Subscriber.js:90)
at DistinctUntilChangedSubscriber.push../node_modules/rxjs/operators/distinctUntilChanged.js.DistinctUntilChangedSubscriber._next (distinctUntilChanged.js:103)
at DistinctUntilChangedSubscriber.push../node_modules/rxjs/Subscriber.js.Subscriber.next (Subscriber.js:90)
at DebounceTimeSubscriber.push../node_modules/rxjs/operators/debounceTime.js.DebounceTimeSubscriber.debouncedNext (debounceTime.js:98)
at AsyncAction.dispatchNext (debounceTime.js:114)
at AsyncAction.push../node_modules/rxjs/scheduler/AsyncAction.js.AsyncAction._execute (AsyncAction.js:111)
at AsyncAction.push../node_modules/rxjs/scheduler/AsyncAction.js.AsyncAction.execute (AsyncAction.js:86)

这是我的代码:

private searchTerm = new Subject<string>();
public termsArray: any = [];
constructor(private apiService: DataService){
const result$ = this.searchTerm
.debounceTime(100)
.distinctUntilChanged()
.switchMap(term => this.apiService.getSearchTest(term))
.subscribe(result => {
this.termsArray = result.suggestions as Array<any>;
console.log(this.termsArray);
}
, err => console.log(err))
}

autocompleteTest = (text$: Observable<string>) =>
text$.pipe(
debounceTime(300),
distinctUntilChanged(),
map(term => term.length < 1 ? []
: this.termsArray
.filter(v => v.toLowerCase().indexOf(term.toLowerCase()) > -1)
.slice(0, 10))
)

onKeyUpSearch(searchText: string){
if (searchText !== "") this.searchTerm.next(searchText);
}

最佳答案

通常你有两件事

private searchTerm = new Subject<string>();
observableSearchTerm=this.searchTerm.asObservable()

你在 searchTerm 上创建了“next”,但是订阅了 observable

onKeyUpSearch(searchText: string){
if (searchText !== "") this.searchTerm.next(searchText);
}
//But subscribe to the "Observable"
this.observableSearchTerm
.debounceTime(100)
.distinctUntilChanged()
.switchMap(term => this.apiService.getSearchTest(term))
.subscribe(result => {
...
}

注意 1:在 RxJs 6(Angular 6)中,您必须使用管道更改代码

 this.observableSearchTerm.pipe(
debounceTime(100),
distinctUntilChanged(),
switchMap(term => this.apiService.getSearchTest(term))
).subscribe(result => {
...
}

注意 2:您可以使用 FromControl 并直接订阅值更改

//In .html
<input type="text" [formControl]="control">

//In .ts
control:FormControl=new FormControl() //Define the control
//..after in ngOnInit
ngOnInit()
{
this.control.valueChanges.pipe(
debounceTime(100),
distinctUntilChanged(),
switchMap(term => this.apiService.getSearchTest(term)
).subscribe(result=>{
....
})
}

参见 stackblitz

关于angular - 如何处理 rxjs 和 angular 5 中的 Observables,bootstrap typeahead 实现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52951072/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com