【问题标题】:Firebase List Objects to Observable Array in Angular 2Firebase将对象列表到Angular 2中的可观察数组
【发布时间】:2017-06-12 14:29:00
【问题描述】:

我已将 Flashlight 与我的 Angular 2 项目集成。手电筒执行以下操作:

  1. 自动为 ElasticSearch 集群的指定 Firebase 路径编制索引,并监控这些路径的变化,重新编制任何变化的索引。
  2. 响应写入指定 Firebase 路径(例如“搜索/请求”)的查询对象,将 ElasticSearch 响应写入指定 Firebase 路径(例如“搜索/响应”)。

使用以下结构将响应写入 Firebase:

使用 Angularfire 2,我的搜索结果如下:

searchThreads(term: string) {
    let queryBody: Object = {
        index: 'firebase',
        type: 'thread',
        q: term
    }
    this.requestKey = this.af.database.list('/search/request').push(queryBody).key
}

如果我想要该搜索的原始结果以及上图中显示的所有路径,我会这样做:

this.af.database.list(`search/response/${this.requestKey}`)

我想要的是在_source 找到的对象。我想遍历响应 hits 并用这些对象填充我的视图。我怎样才能将这些对象放入一个可观察的数组中?

【问题讨论】:

    标签: angular elasticsearch typescript firebase angularfire2


    【解决方案1】:

    我不相信只提取 _source 孩子是不可能的。但是,您可以让它比提取完整的搜索响应更有效。

    每个命中都包含很少的源信息,因此只需检索命中并将每个命中映射到其_source

    this.af.database
      .list(`search/response/${this.requestKey}/hits/hits`)
      .map(hits => hits.map(hit => hit._source))
    

    此外,您可以使用限制查询来提取hits 的子集:

    this.af.database
      .list(`search/response/${this.requestKey}/hits/hits`, {
        query: {
          limitToFirst: 10
        }
      })
      .map(hits => hits.map(hit => hit._source))
    

    或者,如果您有一些最低分数标准,您可以在按孩子排序后执行查询:

    this.af.database
      .list(`search/response/${this.requestKey}/hits/hits`, {
        query: {
          orderByChild: '_score',
          startAt: 1.0
        }
      })
      .map(hits => hits.map(hit => hit._source))
    

    (我没有使用手电筒,所以我不确定评分是如何工作的,但startAt 和/或endAt 的某种组合应该可以让您优化您的查询。)

    【讨论】:

    • 谢谢@cartant。我想你在过去的一周里已经回答了我几乎所有的问题!将其存储在可观察数组中就像 this.threads = this.af.database .list(search/response/${this.requestKey}/hits/hits) .map(hits => hits.map(hit => hit._source)) 一样简单,如果我将它放在构造函数中或 ngOnInit() 中。但是,如果我将代码放在将术语作为可观察对象并将查询分配给 this.threads 的方法中,我将无法让可观察对象发出任何新内容
    • 为什么会发生这种情况取决于很多上下文。如果你不能让它工作,也许会问另一个问题 - 包括你的组件等。在此期间,你可以将 ChangeDetectorRef 注入组件的构造函数 - constructor(private changeDetectorRef: ChangeDetectorRef) - 并且可以在设置 this.threads 后调用 this.changeDetectorRef.markForCheck()强制更改检测。
    猜你喜欢
    • 1970-01-01
    • 2018-07-24
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    相关资源
    最近更新 更多