我正在使用此处找到的 KnockoutJS 自动完成代码:
一般来说,它工作得很好。我正在使用 JQuery Ajax 调用来获取自动完成的数据。当我在输入字段中键入,然后从列表中选择一个值时,相应的值会在 Knockout ViewModel 中设置。但是,我无法让它从自动完成中设置选定的文本值。
(这是为了能够查找 SIC 编号,给出部分描述)
我已经定义:
function Sic(SICCode, SICDescription) {
var self = this;
self.SICCode = ko.observable(SICCode);
self.SICDescription = ko.observable(SICDescription);
}
我的 ViewModel 有:
self.SICCode = ko.observable("");
self.SICDescription = ko.observable("");
self.SicCodes = ko.observableArray();
查找功能是:
self.getSicCode = function (searchTerm, sourceArray) {
$.getJSON(_serviceURL + "/GetSicFromDescription/" + searchTerm, function (data) {
if (data.length > 0) {
var result = [];
$.map(data, function (item) {
result.push(new Sic(item.SicCode, item.Description));
});
sourceArray(result);
}
});
}
在输入标签中(它实际上是一个 .NET 页面(实际上是一个 DotNetNuke 自定义模块,但这并不重要))我有:
<div>SIC:<br />
<input type="text" maxlength="30"
data-bind="value: SICDescription,
jqAuto: {minLength: 3, autoFocus: true}, jqAutoQuery:getSicCode,
jqAutoSource: SicCodes, jqAutoSourceLabel: SICDescription,
jqAutoValue: SICCode, jqAutoSourceInputValue: 'SICDescription',
jqAutoSourceValue: 'SICCode'" />
<span data-bind="text: SICCode"></span>
</div>
(我尝试过使用和不使用 value: binding)在输入框中输入内容将正确进行查找并显示匹配项的列表。然后我可以选择一个并在跨度中查看相应的数字。
但是,当我单击一个按钮,然后将 ViewModel 数据发送到服务器时,self.SICDescription() 为空...... self.SICCode() 包含正确的值。
那么,如何将选定的描述填充到 ViewModel 中?我会假设使用输入字段的值绑定应该可以解决问题。但是不行。
无论如何我需要做一些事情,还是我必须做一些工作(循环遍历返回值的数组并提取正确的描述)?
谢谢。