【发布时间】:2018-02-23 01:57:46
【问题描述】:
您好,我正在使用 Angular JS 5 开发 Web 应用程序。我正在尝试完成自动搜索功能。我能够使它与静态值一起工作。现在我正在尝试通过 API 调用获取数据。下面是我的代码。
import { Component } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import { TypeaheadMatch } from 'ngx-bootstrap/typeahead';
@Component({
selector: 'demo-typeahead-async',
templateUrl: './async.html'
})
export class DemoTypeaheadAsyncComponent {
asyncSelected: string;
typeaheadLoading: boolean;
typeaheadNoResults: boolean;
dataSource: Observable<any>;
statesComplex: any[] = [
{ id: 1, name: 'Alabama', region: 'South' },
{ id: 2, name: 'Alaska', region: 'West' },
{
id: 3,
name: 'Arizona',
region: 'West'
},
{ id: 4, name: 'Arkansas', region: 'South' },
{ id: 5, name: 'California', region: 'West' },
{ id: 6, name: 'Colorado', region: 'West' }
];
constructor() {
this.dataSource = Observable.create((observer: any) => {
// Runs on every search
observer.next(this.asyncSelected);
}).mergeMap((token: string) => this.getStatesAsObservable(token));
}
getStatesAsObservable(token: string): Observable<any> {
let query = new RegExp(token, 'ig');
return Observable.of(
this.statesComplex.filter((state: any) => {
return query.test(state.name);
})
);
}
changeTypeaheadLoading(e: boolean): void {
this.typeaheadLoading = e;
}
changeTypeaheadNoResults(e: boolean): void {
this.typeaheadNoResults = e;
}
typeaheadOnSelect(e: TypeaheadMatch): void {
console.log('Selected value: ', e.value);
}
}
在上面的代码中,我玩的是this.statesComplex(Hard coded data)。 下面是我的html代码。
<pre class="card card-block card-header">Model: {{asyncSelected | json}}</pre>
<input [(ngModel)]="asyncSelected"
[typeahead]="dataSource"
(typeaheadLoading)="changeTypeaheadLoading($event)"
(typeaheadNoResults)="changeTypeaheadNoResults($event)"
(typeaheadOnSelect)="typeaheadOnSelect($event)"
[typeaheadOptionsLimit]="7"
typeaheadOptionField="name"
placeholder="Locations loaded with timeout"
class="form-control">
<div *ngIf="typeaheadLoading===true">Loading</div>
<div *ngIf="typeaheadNoResults===true">❌ No Results Found</div>
我已经创建了如下调用 API 的服务。
this.useronboardService.searchUsers(query).subscribe(results => this.filterUsername(query, results), error => this.onUsersSearchDataLoadFailed(error));
我尝试如下。下面的代码对我不起作用。
getStatesAsObservable(token: string): Observable<any> {
let query = new RegExp(token, '');
return Observable.of(
this.useronboardService.searchUsers(token).subscribe(
result => result.filter((user: any) => {
return query.test(user.userName),
error => console.log(error)
}))
);
我想使用上述服务数据而不是 this.statesComplex。我的服务返回包含属性 id 和用户名的数组。有人可以帮我完成这项工作吗?谢谢。
【问题讨论】:
-
你可以订阅formControl的valueChanges Observable,添加一些debounceTime,这样它就不会做很多后端调用。并让您在订阅中的 debounceTime 之后进行后端调用。
-
谢谢帕万。你能分享我几个链接来完成它。谢谢
标签: ajax angular httprequest