将AlgoliaInstantSearch与Angular集成

来自菜鸟教程
跳转至:导航、​搜索

我们已经介绍了如何将 Algolia InstantSearch 集成到 Vue.js 应用程序中,现在让我们来看看如何为 Angular 应用程序做同样的事情。 这现在很容易做到,这要归功于最近发布的 Angular InstantSearch 库

Algolia 提供流行的搜索即服务解决方案,使创建和搜索索引数据集变得容易。 例如,这个网站上的即时搜索由 Algolia 和 Jekyll Algolia 插件提供支持。

请注意,您需要将 Angular InstantSearch 与 Angular 4+ 一起使用。


设置

您需要一个可以查询的 Algolia 索引。 创建和填充数据索引是一个完全不同的主题,所以在这里我们假设您已经建立了一个索引。 出于本文的目的,我们将使用 Algolia 提供的测试索引。

首先,将 angular-instantsearch 包添加到您的 Angular 项目中:

# using Yarn:
$ yarn add angular-instantsearch

# or npm:
$ npm i angular-instantsearch

接下来,在您的应用模块或功能模块中,导入 NgAisModule 并将其添加到您的导入列表中:

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { NgAisModule } from 'angular-instantsearch';
import { AppComponent } from './app.component';

如果在 Angular 功能模块中使用 NgAisModule,则省略对 forRoot() 的调用。



最后,您还需要为 InstantSearch 添加样式文件。 您可以将以下条目添加到 .angular-cli.json 的样式数组中:

.angular-cli.json

...
"styles": [
  "styles.css",
  "../node_modules/angular-instantsearch/bundles/instantsearch.min.css",
  "../node_modules/angular-instantsearch/bundles/instantsearch-theme-algolia.min.css"
],
...

对 .angular-cli.json 文件进行更改后,您需要重新启动本地服务器。


用法

一切都从 ng-ais-instantsearch 组件开始,它将成为 InstantSearch 小部件的包装器。 ng-ais-instantsearch 采用带有 Algolia 索引的键和名称的配置对象:

app.component.html

<ng-ais-instantsearch [config]="algoliaConfig">
  <!-- Widgets here -->
</ng-ais-instantsearch>

app.component.ts

import { Component } from '@angular/core';


现在我们已经准备好并配置了包装器,我们可以开始添加小部件来查询和过滤索引:

app.component.html

<ng-ais-instantsearch [config]="algoliaConfig">
  <ng-ais-search-box></ng-ais-search-box>
  <ng-ais-stats></ng-ais-stats>

  <h3>Filter by price range:</h3>
  <ng-ais-refinement-list attribute="salePrice_range"></ng-ais-refinement-list>
  <ng-ais-clear-refinements [autoHideContainer]="true" buttonLabel="Clear filter"></ng-ais-clear-refinements>

  <ng-ais-hits>
    <ng-template let-hits="hits" let-results="results">
      <!-- Nothing found? -->
      <div *ngIf="hits.length === 0">
        😢 Nothing found for
        <strong>{{results.query}}</strong>.
      </div>

      <div *ngFor="let hit of hits" class="result-card">
        <h2>
          <a [href]="hit.url" target="_blank">
            <ng-ais-highlight attribute="name" [hit]="hit">
            </ng-ais-highlight>
          </a>
        </h2>
        <p>{{ hit.shortDescription }}</p>

        <img [src]="hit.image" alt="{{ hit.name }} thumbnail">

        <p>
          <span class="price">{{ hit.salePrice | currency}}</span>
        </p>
      </div>
    </ng-template>
  </ng-ais-hits>

  <ng-ais-pagination></ng-ais-pagination>
</ng-ais-instantsearch>

在这里,我们使用了 Algolia InstantSearch 提供的一些小部件:

  • ng-ais-search-box:搜索输入查询索引。
  • ng-ais-stats:关于搜索结果的统计信息。
  • ng-ais-refinement-list:通过索引中的属性过滤结果的选项(称为细化)。
  • ng-ais-clear-refinements:用于清除应用的细化的按钮。
  • ng-ais-hits:魔法发生的地方并显示结果(hits)。 在这里,我们使用 ng-template 定义了一个模板,以便我们可以使用自己的标记格式化 hits。 我们可以访问 hitsresults 变量,每个 hit 都包含一个结果的数据作为对象。
  • ng-ais-highlight:突出显示与查询匹配的搜索部分的小部件。
  • ng-ais-pagination:用于附加结果的分页小部件。

然后让我们对搜索结果应用一些样式:

app.component.css

ng-ais-clear-refinements {
  display: block;
  margin-top: 1rem;
}

::ng-deep .ais-Hits {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-gap: 10px;
  margin-top: 2rem;
}
::ng-deep .result-card {
  padding: 0.45rem 2rem;
  background: linear-gradient(45deg, #eee, white 50%);
  border-radius: 6px;
  border: 2px solid #f3f3f3;
}

请注意使用 ::ng-deep 选择器来访问嵌套在小部件内的元素。

这是我们生成的 UI:

🕵️ 查询您的索引,玩得开心! 您可以参考 官方 API 文档 以获取有关可用小部件的更多详细信息。