代码之家  ›  专栏  ›  技术社区  ›  Jay Gray

如何使用amp list、amp mustache、amp form和amp bind实现autosuggest?

  •  1
  • Jay Gray  · 技术社区  · 6 年前

    如何使用amp list、amp mustache、amp form和amp bind实现autosuggest?

    想实施 autosuggest 用于页内搜索

    研究过这个 Google example

    想要 自动提示器 以这种格式在一页纸上找到我们的州首府

    <div id='4'>Little Rock is ...</div>
    

    我们的json结构如下

    {
      "items": [{
        "query": "",
        "results": [{"Montgomery, Alabama","id='1'"},
        {"Juneau, Alaska","id='2'"},
        {"Phoenix, Arizona","id='3'"},
        {"Little Rock, Arkansas","id='4'"}]
      }]
    }
    

    已实现MCV(最小、完整、可验证) example here

    如何根据结果列表中的选择修改示例以导航到页面上的特定项?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Ankita Dhandha    6 年前

    这里有一个你需要做的快速摘要

    一。生成过滤结果的服务器终结点。确保它有合适的cors头。

    2.用数字id呈现json端点中id为的autosuggest项

    三。在每个或

  • 标签。

    #2 会像这样

    {{#results}}
        <div
            class='select-option no-outline'
            role='option'
            tabindex='0'
            on='tap:autosuggest-list.hide,{{id}}.scrollTo'
            option='{{title}}'
        >{{title}}</div>
    {{/results}}
    

    下面是具体的构建过程 (步骤a–d)

    答。 HTML和AMP代码:

    server endpoint https://example.com/state_capitals/query

    amp-form

    <form
      method='post'
      action-xhr='https://example.com/state_capitals'
      target='_blank'
      id='search-form'
      on='submit:autosuggest-list.hide;submit-success:results.show'
      autocomplete='off'
    >
    

    HTML input

    <div class='search-container'>
    <input
      id='query'
      name='query'
      type='text'
      class='search-box'
      on="input-debounced:AMP.setState({
          query: event.value,
          autosuggest: event.value
        }),
        autosuggest-list.show,
        results.hide"
      [value]="query || ''"
    />
    <button class='search-submit' type='submit'>Search</button>
    </div>
    

    上面的代码集输入框

    amp-list 接下来,绑定结果 '/state_capitals/query' 终点到 安培表 amp-selector 组件如下:

    <amp-list
      class='autosuggest-box'
      layout='fixed-height'
      height='120'
      src='/state-capitals/query'
      [src]="'/state-capitals/query?q=' + (autosuggest || '')"
      id='autosuggest-list'
      hidden
    >
    

    AMP列表组件的源来自 /state-capitals/query 在里面 JSON 格式。

    JSON endpoint structure

    {"items":[{
        "query": "",
        "results": [
            {"title": "Little Rock, Arkansas", "id":"4"},
            {"title": "Olympia, Washington", "id":"47"},
            {"title": "Charleston, West Virginia", "id":"48"},
            {"title": "Madison, Wisconsin", "id":"49"},
            ...
    ]}]}
    

    amp-template 使用打印json格式的结果 amp-mustache 组件。

    <amp-list ...>
    <template type='amp-mustache'>
    {{#results}}
      <amp-selector
        keyboard-select-mode='focus'
        layout='container'
        on='select:AMP.setState({query: event.targetOption}),
        autosuggest-list.hide,{{id}}.scrollTo'
      >
        <div
          class='select-option no-outline'
          role='option'
          tabindex='0'
          on='tap:autosuggest-list.hide'
          option='{{title}}'
        >{{title}}</div>
    {{/results}}
      </amp-selector>
    </template>
    </amp-list>
    

    简要说明 安培选择器 on= 以下代码:

    on='select:AMP.setState({
      query: event.targetOption}),
      autosuggest-list.hide,{{id}}.scrollTo'
    

    将滚动到:

    {{id}}.scrollTo
    

    例如,其中表行id是107

    <li><a href="1">Montgomery</a></li>
    <li><a href="2">Juneau</a></li>
    <li><a href="3">Phoenix</a></li>
    <li><a href="4">Little Rock</a></li>
    

    乙。 端点实现

    一。将json对象数据声明为:

    Data = [
      {"title": "Little Rock, Arkansas", "id":"4"},
      ...
      {"title": "Olympia, Washington", "id":"47"},
      {"title": "Charleston, West Virginia", "id":"48"},
      {"title": "Madison, Wisconsin", "id":"49"},
    ];
    

    2.实现node.js服务器

    app.use('/state_capitals/query', (req, res) => {
      assertCors(req, res, ['GET']);
      const MAX_RESULTS = 4;
      const query = req.query.q;
    

    三。应用node.js脚本

    if (!query) {
      res.json({
        items: [{
          query: "",
          results: capitals.slice(0, MAX_RESULTS)
        }]
      });
    } else {
      const lowerCaseQuery = query.toLowerCase();
      const filtered = capitals.filter(function(e) {return e.title.toLowerCase().includes(lowerCaseQuery)});
        res.json({
          items: [{
              query: "",
              results: filtered.slice(0, MAX_RESULTS)
          }]
        });
      }
    });
    

    C. nginx设置

    node.js应用程序在域和指定端口上运行。

    当用户在浏览器中运行网站时,要求nginx将端口号80的所有流量转发到指定端口。这是使用conf文件中的位置设置完成的

    location /state_capitals/ {
      proxy_pass http://domain:3002/;
    }
    

    D: 实施

    Here is a working version