我正在构建一个使用Algolia instantsearch.js来显示搜索结果的服务。
启动项目我创建了一个模板,我在表格中显示了客户。然后我想添加表格内容在用户输入特定客户信息(例如手机号码)时更改的功能。这就是我使用Algolia和instantsearch.js实现这一目标的原因。
我设法让它工作但我在设计整个事情时遇到了问题:
搜索框和点击小部件(显示结果的位置)将添加到具有特定HTML / CSS结构的DOM中:
搜索框
<!- Input field -->
<input autocapitalize="off" autocomplete="off" autocorrect="off" placeholder="Search for customers.." role="textbox" spellcheck="false" type="text" value="" class="ais-search-box--input">
<!- Algolia Powered by logo -->
<span class="">
<div class="ais-search-box--powered-by">
...
<a class="ais-search-box--powered-by-link">...</a>
</div>
</span>
<!- Search magnifier icon -->
<span class="ais-search-box--magnifier-wrapper">
<div class="ais-search-box--magnifier">...</div>
</span>
<!- Clear search icon -->
<span class="ais-search-box--reset-wrapper" style="display: none;">
<button type="reset" title="Clear" class="ais-search-box--reset">...</button>
</span>
点击率:
<div class="ais-hits">
<div class="ais-hits--item">
First customer data (all of them)
</div>
<div class="ais-hits--item">
Second customer data (all of them)
</div>
<div class="ais-hits--item">
Third customer data (all of them)
</div>
<div class="ais-hits--item">
First customer data (all of them)
</div>
</div>
尝试使用这些结果令人沮丧,因为我已经准备好了我的HTML / CSS代码(搜索字段和表格的结果旨在与网站其他部分的外观相匹配)。
我想从搜索中获取的是我可以使用的响应并在正确的位置添加数据。例如,现在我想用客户的数据填充,但我不能:
<table class="table">
<thead>
<tr>
<th>Name</th>
<th>Surname</th>
<th>Email</th>
<th>Mobile</th>
</tr>
</thead>
<tbody>
<tr id="hits"></tr>
</tbody>
</table>
以下是我使用的模板:
<script type="text/html" id="hit-template">
<td>@{{ name }}</td>
<td>@{{ surname }}</td>
<td>@{{ email }}</td>
<td>@{{ mobile }}</td>
</script>
我正在使用Laravel和刀片模板在值前面添加@。
我得到的是一张包含第一个客户所有数据的表格。只创建了一个表行。
在JS代码中,我使用以下内容:
var search = instantsearch({
appId: 'my-app-id',
apiKey: 'my-search-only-api-key',
indexName: 'my-indices',
urlSync: false,
searchParameters: {
hitsPerPage: 10
}
});
search.addWidget(
instantsearch.widgets.searchBox({
container: '#searchbox',
placeholder: 'Search for customers..',
poweredBy: true,
wrapInput: false
})
);
search.addWidget(
instantsearch.widgets.hits({
container: '#hits',
templates: {
item: document.getElementById('hit-template').innerHTML,
empty: "We didn't find any results for the search <em>\"{{query}}\"</em>"
}
})
);
search.start();
有没有办法从instantsearch而不是widget获取JSON响应?我不想沿着服务器站点路线走下去,因为这是instantsearch.js的全部内容。
如果我无法获得简单的JSON响应,我需要做些什么才能更改窗口小部件的布局。覆盖所有ais类?
提前致谢!
答案 0 :(得分:2)
您无法完全控制使用窗口小部件API呈现的内容。但是还有另一个称为连接器的API。这个允许您创建自定义渲染,而无需重新实现窗口小部件的核心逻辑。您可以在the documentation上查看此API。