我有一个绑定到odata数据源的标准kendo web组合框。如果你输入它并获得正确的文本和值,它看起来很好。
但是,如果绑定了它,并且在代码中设置了.value()属性,则不会查找文本以查找已设置的值。 (如果您正在加载现有数据,这是相当标准的行为)
我原以为它会去服务器并通过dataValueField属性查找确切的值并专门返回该项并设置文本。
我该如何做到这一点?
答案 0 :(得分:3)
让我们拥有以下ComboBox
:
var combobox = $("#combobox").kendoComboBox({
dataTextField : "ProductName",
dataValueField: "ProductID",
dataSource : {
type : "odata",
transport: {
read: "http://demos.kendoui.com/service/Northwind.svc/Products"
}
}
}).data("kendoComboBox");
(您可以自己使用它,因为它指的是Kendo UI服务器中可用的服务)。
然后,您可以使用以下代码片段来设置value
或text
(无论您喜欢什么)。
// Set value of the ComboBox using dataValueField (ProductId)
combobox.value(4);
// Set value of the ComboBox using dataTextField (ProductName)
combobox.text("Chef Anton's Cajun Seasoning");
阅读时你应该使用:
alert("Current text/value: " + combobox.text() + "/" + combobox.value());
这两种方法都可以正常使用,因为您可以在这里办理http://jsfiddle.net/OnaBai/64gXE/。
答案 1 :(得分:1)
你必须在a **中真正踢这个东西才能让它运转起来。有一百万个配置,其中只有少数似乎可以工作
WebAPI OData实现(4.5)和Telerik Datasource真的不能很好地协同工作。这是我的工作客户端ComboBox实现:
$("#dropdownlist").kendoComboBox({
optionLabel: " ",
dataTextField: "name",
dataValueField: "id",
dataSource: {
serverFiltering: true,
transport: {
read: {
url: "/odata/MyService",
'type': 'Get'
}
},
schema: {
parse: (response: any) => {
var results = response.value;
var items: any = [];
for (var i = 0; i < results.length; i++) {
items.push(
{
id: results[i].id,
name: results[i].name,
});
}
return items;
},
}
}
});
你会注意到我必须在架构对象的parse方法中劫持数据并按摩它
我的OData回复供参考:
答案 2 :(得分:0)
重新绑定kendo组合框时遇到了这个问题。基本上我必须重新查询服务器,就好像用户输入了它一样。然后一旦查询完成,我使用之前选择的值选择正确的项目。
var comboBoxElem = $("#controlNameHere");
comboBoxElem.kendoComboBox(
{
placeholder: "Start typing...",
dataTextField: "yourDataTextField", // field used in the re-query due to 'contains' filter
dataValueField: "yourDataValueField",
filter: "contains",
change: selectFunc,
dataSource: {
serverFiltering: true,
pageSize: 20,
transport: {
read: {
url: "http://yourUrlHere"
}
}
}
});
// the following code is all about re-selecting the previous value
var comboBox = comboBoxElem.data('kendoComboBox');
var previousTextValue = 'text of the previous entry here';
var previousValue = '543';
comboBox.text(previousTextValue); // to show the user text while re-query takes place
// reload previous item(s) from server, then re-select the desired item
comboBox.dataSource.query({
filter: { operator: "contains", field: 'yourDataTextField', value: previousTextValue },
complete: function () {
setTimeout(function () {
comboBox.select(function (dataItem) {
return dataItem.yourDataValueField == previousValue;
});
}, 200); //allow the observable collection to be updated (no event I know of helps here :(
}
});
希望这很清楚,我已修改内联代码以保护无辜者,因此可能会出现最轻微的语法错误。
请记住,您在控件的选项(设置)中使用的过滤器应该与您为简单起见时使用的过滤器相同,否则您将获得多个过滤器到服务器。