自动完成小部件确实实现了这种行为,尽管我在 DevExtreme 支持网站上发现了一些帖子说您必须改用查找小部件。
关键是自动完成小部件希望您的数据源查找并使用$filter 和其他参数来返回正确的过滤列表。您也可以添加自己的参数;见下文。
在 DevExpress 网站上有一个演示:
https://js.devexpress.com/Demos/WidgetsGallery/Demo/Autocomplete/Overview/jQuery/Light/
它是“自定义项目模板和数据源使用”下的 State 字段——即使数据集很简单(美国 50 个州的列表),它实际上是在查询远程数据源并返回过滤列表。这是演示代码(JQuery,其他风格请参见演示链接):
$("#state").dxAutocomplete({
dataSource: new DevExpress.data.ODataStore({
url: "https://js.devexpress.com/Demos/DevAV/odata/States?$select=Sate_ID,State_Long,State_Short",
key: "Sate_ID",
keyType: "Int32"
}),
placeholder: "Type state name...",
valueExpr: "State_Long",
itemTemplate: function(data) {
return $("<div>" + data.State_Long +
" (" + data.State_Short + ")" + "</div>");
},
onValueChanged: function(data) {
state = data.value;
updateEmployeeInfo();
}
});
在状态字段中输入“ala”,并注意发生了此网络请求(我使用 Chrome 开发人员工具的“网络”选项卡查看了该请求)。
https://js.devexpress.com/Demos/DevAV/odata/States?$select=Sate_ID,State_Long,State_Short&$top=10&$filter=(substringof(%27ala%27%2Ctolower(State_Long)))
通过观察 $top 和 $filter 参数,这将返回仅包含两个状态的预期列表。
您还可以添加自己的参数——我这样做是因为我无法处理参数名称中的$。只需在数据源的beforeSend 事件中使用params:
dataSource: new DevExpress.data.ODataStore({
url: "https://js.devexpress.com/Demos/DevAV/odata/States?$select=Sate_ID,State_Long,State_Short",
key: "Sate_ID",
keyType: "Int32"
beforeSend: function (e) {
console.log(e.params) // Show original params
e.params.SearchTerm = $("#state").val()
e.params.Limit = 10
console.log(e.params) // There's my new params
}
})
现在数据源可以使用参数SearchTerm 和Limit 并忽略其他参数。