【问题标题】:Howto get data through http request for auto search in Angular?如何通过http请求获取数据以在Angular中进行自动搜索?
【发布时间】: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">&#10060; 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


【解决方案1】:

this.useronboardService.searchUsers(token) 已经是一个 observable,所以你不需要将它包装在 Observable.of(...) 中。只需将结果映射到过滤值即可。

getStatesAsObservable(token: string): Observable<any> {
    let query = new RegExp(token, '');
    return this.useronboardService.searchUsers(token)
        .map(result => result.filter((user: any) => query.test(user.userName)));
}

【讨论】:

  • 不客气。您还可以简化构造函数,使用Observable.of(this.asyncSelected) 而不是Observable.create(...)
  • 嗨,大卫。我在上面的代码中发现了一个错误。如果我们输入字符串进行搜索时存在两条匹配记录,在ui中我们将只得到一个结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
相关资源
最近更新 更多