我正在使用如何创建自动完成组合框?
我想允许用户从建议列表中选择一个值,或者输入一个不在建议列表中的值。如何将输入的值放入我的可观察字段?
例如,如果用户键入“smi”,自动完成列表将显示以“smi”开头的史密斯和其他姓氏,但是,如果他们没有从列表中选择一个选项,我只想将我的 observable 字段的值设置为是'smi'。目前,设置可观察属性的唯一方法是当用户从建议列表中选择一个项目时。
我有以下代码(HTML):
<input type="text" data-bind="
value: surname,
jqAuto: { autoFocus: true },
jqAutoSource: surnames,
jqAutoQuery: surnameAutocomplete,
jqAutoValue: surname"
/>
JavaScript 视图模型(简化):
var vm = {
surnames: ko.observableArray(),
surname: ko.observable(),
surnameAutocomplete: function (searchTerm, result) {
repository.surnameAutocomplete(searchTerm, result);
};
解决方案:
我在两个地方修改了自定义绑定处理程序:
init: function - 添加了以下内容
// New setting to allow / disallow a user to enter values that are in the autocomplete list. forceSelection = allBindings.jqAutoForceSelection;
选项更改功能 - 修改为以下
//on a change, make sure that it is a valid value or clear out the model value options.change = function (event, ui) { var currentValue = $(element).val(); // Start: new code, check new setting on whether to force user to make a selection if (!forceSelection) { writeValueToModel(currentValue); return; } // End: new code var matchingItem = ko.utils.arrayFirst(unwrap(source), function (item) { return unwrap(inputValueProp ? item[inputValueProp] : item) === currentValue; }); if (!matchingItem) { writeValueToModel(null); } }
我还发现自动完成列表中的第一项被自动选择,但随后通过设置 autofocus: false 解决了我的问题,例如,
<input type="text" data-bind="
jqAuto: { autoFocus: false }, /* This fixes the auto select issue */
jqAutoSource: surnames,
jqAutoQuery: surnameAutocomplete,
jqAutoValue: surname,
jqAutoForceSelection: false"
/>