在Symfony2中使用Typeahead+Bloodhound和FOSJsRoutingBundle执行查询
-
02-01-2020 - |
题
我正在尝试设置Typeahead+Bloodhound以在字段上执行带有建议的搜索。该字段的HTML代码如下:
<div class="col-sm-10" id="products_forms">
<input type="text" placeholder="Producto" id="ProductoForm_0_product_id" name="ProductoForm[0][product_id]" class="form-control typeahead">
</div>
我使用Symfony的两个主要功能:一个用于返回所有产品并将其用作 prefetch
另一个用于过滤后的产品。这就是该函数的路由的样子:
// the one I use as prefetch parameter in bloodhound
* @Route("/get_products", name="all_products")
// the one I use as remote
* @Route("/get_products/{filter}", name="filter_products")
正如你所看到的,第一个没有得到任何参数,因为它返回所有的产品作为JSON值,但第二个需要 {filter}
作为执行 LIKE
并仅返回过滤后的产品。
现在我完全不知道猎犬是如何工作的,所以我读了 文件 也为typeahead阅读 文件 并采取从一个例子 这里 该 Remote
一个并制作了这个代码:
// Trigger typeahead + bloodhound
var products = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
prefetch: Routing.generate('all_products'),
remote: Routing.generate('filter_products', { 'filter' : '%query' })
});
products.initialize();
$('#products_forms .typeahead').typeahead(null, {
name: 'products',
displayKey: 'value',
source: products.ttAdapter()
});
对吗?我的意思是当页面加载时,我会得到所有的产品预取,但如果我输入任何 .typeahead
元素我只会得到过滤的?不知道是不是 %query
是我应该传递给正确的值 filter_products
路由以便获得过滤后的值。有什么帮助吗?
这是我第一次使用Typeahead+Bloodhound
解决方案
更换/更换 remote: Routing.generate('filter_products', { 'filter' : '%query' })
与e.g.
var url = Routing.generate('filter_products', {filter: 'WILDCARD'});
// ... some code
remote: {
url: url,
wildcard: 'WILDCARD'
}
这将首先使用RoutingBundle生成一个通用url,并将"通配符"作为过滤器。比告诉bloodhound在url上使用"通配符"作为占位符,它将完美地将其替换为输入的查询。
不隶属于 StackOverflow