【问题标题】:ngbTypeahead search results missingngbTypeahead 搜索结果丢失
【发布时间】:2021-06-26 11:40:50
【问题描述】:

我目前正在编写 ngbTypeahead 搜索,但我被困住了,因为我从未真正使用过 Observables,这是 ngbTypeahead search 的预期返回类型。

我的组件中的搜索功能是这样的:

  search: OperatorFunction<string,  readonly LoqateResponseModel[]> = (text$: Observable<string>) => {
return text$.pipe(
  switchMap(term => this.addressService.searchAddress(term, this.countryCode)),
  map(results => {
    const searchResults = results[LoqateKeyEnum.ITEMS] as [];
    const searchResultLoqateModels: LoqateResponseModel[] = [];
    searchResults.forEach(result => {
      searchResultLoqateModels.push(new LoqateResponseModel(
        result[LoqateKeyEnum.ID],
        result[LoqateKeyEnum.TYPE],
        result[LoqateKeyEnum.TEXT],
        result[LoqateKeyEnum.HIGHLIGHT],
        result[LoqateKeyEnum.DESCRIPTION]));
    });
    return searchResultLoqateModels;
  })
);

}

resultFormatter = (loqateResponse: LoqateResponseModel): string => loqateResponse.display();

我正在进行 loqate 搜索,并将结果作为模型对象存储在列表中并返回。

public searchAddress(searchValue, countryCode): Observable<object> 
  {
    const httpParams = new HttpParams();
    return this.httpClient.post(this.addressSearchUrl, {}, {
      headers: this.headers,
      params: new HttpParams()
        .set('Key', loqateKey)
        .set('Text', searchValue)
        .set('Origin', countryCode)
    });
  }

模型如下所示:

export class LoqateResponseModel {
  constructor(
    public id: string,
    public type: LoqateTypeEnum,
    public text: string,
    public highlight: string,
    public description: string) {
  }

  public isAddress(): boolean { return this.type === LoqateTypeEnum.ADDRESS; }
  public display(): string { return this.text + ', ' + this.description; }
}

现在我想,LoqateResponseModels 的列表被存储为search 的结果,然后这些列表项中的每一个都被正确格式化以通过resultFormatter 显示在预先输入的弹出窗口中。

tldr:我想使用 ngbTypeahead 搜索某些内容并从 API 端点查询搜索词,并在 typeahead 弹出窗口中显示搜索结果。

编辑:我已经编辑了答案,这段代码正在运行。

【问题讨论】:

  • 您能否具体说明哪些工作有效,哪些工作无效。我不明白到底是什么问题。
  • 我已编辑我的代码以删除误导性代码。我有一个 ngbTypeahead,用户应该可以在其中搜索地址。他输入几个字符,然后调用搜索功能。在搜索功能中,我想调用一个返回搜索结果的 API。我需要订阅这些搜索结果并仍然返回 OperatorFunction,因为这是 ngbTypeaheads 要求。我真的不知道该怎么做。

标签: angularjs typescript rxjs rxjs-observables


【解决方案1】:

我认为您正在寻找switchMap。该运算符将为您订阅一个可观察的源并发出其结果:

您不想return null,您只需返回带有管道修改的可观察对象。

您的操作符函数应该接受一个可观察对象并返回一个可观察对象。您的 observable 可以简单地使用 switchMap 将传入的 text 映射到 api 调用。

search: OperatorFunction<string, readonly LoqateResponseModel[]> = text$ => 
    text$.pipe(
        switchMap(text => this.searchAddress(text))
    );

每次switchMap 收到一些text,它都会为你做一些事情:

  1. 订阅searchAddress(text)
  2. 从此订阅发出结果
  3. 停止发送以前订阅的结果

【讨论】:

  • 感谢您的回答。我已经使用您提供的代码编辑了我的问题,但它没有显示任何搜索建议。我想将 json 响应项转换为 loqate 模型实例并将它们保存在我的 Observable 中,以便以后使用它们。为了显示可读的字符串,我使用了 resultFormatter。它只是没有按预期工作......我需要在返回的 observable 中存储模型而不是字符串的原因是因为我需要稍后在用户选择搜索建议时访问 loqate 模型 ID
  • 控制台有错误吗?你能知道对addressService.searchAddress() 的调用是否真的被执行了吗?
  • 没有错误。你是对的,它没有被执行。但是为什么
  • 看起来您并没有真正使用 resultFormatter。您可以通过应用resultFormatter 进一步修改您的流,这可能是您需要做的所有事情。我不熟悉 ngb 或 Loqate 的东西。
  • 哦,给你!看起来您需要添加return 或删除周围的{}
猜你喜欢
  • 2012-11-24
  • 2020-12-26
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
相关资源
最近更新 更多