Using typeahead.js with jquery ajax call
本文关键字:ajax call jquery with typeahead js Using | 更新日期: 2023-09-27 18:32:40
我正在使用
http://twitter.github.io/typeahead.js/版本 0.9.3
和JQuery version 2.0.3
我有下面的示例,我知道它可以正常工作。
<input id="subCategory" name="subCategory" type="text" />
<script>
$('#subCategory').typeahead({
name: "subCategory",
local: ["how", "when", "where", "who", "why"],
limit: 10
});
</script>
然后,如何更改此设置,以便我可以使用 AJAX 请求对 JSON 的成功结果?
下面的示例不起作用,我的第一个想法是因为它没有等待$.getJSON()
和我的响应来轮询更新或等待异步调用完成。
<script>
$('#subCategory').typeahead({
name: "subCategory",
local: $.getJSON("/subcategories/all/"),
limit: 10
});
</script>
我的第一个想法是,我必须在$.getJSON()
函数的成功回调中应用上面的预类型配置? 有没有更好的方法来解决这个问题?
JSON 调用是对 MVC 控制器操作的调用,该操作返回类似于以下基本示例的JSONResult
:
public ActionResult All()
{
return Json(_subCategoryService.GetAll(), JsonRequestBehavior.AllowGet);
}
我已经测试过并知道这个getJSON
请求可以正常工作。
更新:
在考虑它并执行以下操作而不是异步调用时,我会走得更远,但是 typeahead 数据显示 1 个项目undefined
但这似乎更合适,但是我只打算填充完整列表一次,然后在客户端上过滤它,而不是在有人使用查询参数输入输入框中时进行此远程调用。
<script>
$('#subCategory').typeahead({
name: "subCategory",
remote: "/subcategories/all/",
limit: 10
});
</script>
更新 2:
我现在也意识到我的第一个示例是原语列表,因为我的子类别不:(咄..例:
[{ id: 1, name: "subcategory-1" }, { id: 2, name: "subcategory-2" }]
所以现在我开始查看 typeahead prefetch
选项和 filter
属性,但我真的试图使用它,就好像它是一个下拉列表一样,所以想选择 Id 作为列表中特定条目的支持值
更新 3:
由于我尝试将 typeahead 输入用作组合框,因此我后来更改了我的示例,但使用本地数据而不是我的 JSON 响应,下面的工作并将支持id
值存储在隐藏字段中。
<input id="subCategorySelection" type="hidden" />
<input id="subCategory" name="subCategory" type="text" />
<script>
$("#subCategory").typeahead({
name: "subCategories", // the name for the dataset
local: [{ id: 1, name: "subcategory-1" }, { id: 2, name: "subcategory-2" }],
limit: 10,
valueKey: "name" // the value shown in the textbox
}).on("typeahead:selected typeahead:autocompleted",
function(e, datum) {
$("#subCategorySelection").val(datum.id);
}
);
</script>
怕这还没有得到支持,至少当我几周前看它时。
但。。。这个拉取请求完全可以执行您正在尝试执行的操作。
https://github.com/twitter/typeahead.js/pull/220
下面是在成功回调中执行此操作的示例,但我不太喜欢使用它的方式。
$.getJSON("/subcategories/all/", null, function(response) {
$("#subCategory").typeahead({
name: "subCategories", // the name for the dataset
local: response,
limit: 10,
valueKey: "name"
}).on("typeahead:selected typeahead:autocompleted",
function(e, datum) {
$("#subCategorySelection").val(datum.id);
}
);
});
现在我无论如何都不需要这样做,并且已经使用prefetch
$("#subCategory").typeahead({
name: "subCategories", // the name for the dataset
prefetch: {
url: "/subcategories/all/",
ttl: 360000 /* 1 hour of local storage */
},
limit: 10,
valueKey: "name"
}).on("typeahead:selected typeahead:autocompleted",
function(e, datum) {
$("#subCategorySelection").val(datum.id);
}
);