Kendo ui 绑定到odata的剑道组合框未查找值集的文本

Kendo ui 绑定到odata的剑道组合框未查找值集的文本,kendo-ui,Kendo Ui,我有一个绑定到odata数据源的标准剑道web组合框。如果您键入它并获得正确的文本和值,它看起来很好 但是,如果将其绑定,并在代码中设置.value()属性,则不会查找文本中设置的值。(如果您正在加载现有数据,这是非常标准的行为) 我假设它会转到服务器,通过dataValueField属性查找确切的值,并专门返回项并设置文本 我该如何让它做到这一点呢?让我们拥有以下组合框: var combobox = $("#combobox").kendoComboBox({ dataTextFie

我有一个绑定到odata数据源的标准剑道web组合框。如果您键入它并获得正确的文本和值,它看起来很好

但是,如果将其绑定,并在代码中设置.value()属性,则不会查找文本中设置的值。(如果您正在加载现有数据,这是非常标准的行为)

我假设它会转到服务器,通过dataValueField属性查找确切的值,并专门返回项并设置文本


我该如何让它做到这一点呢?

让我们拥有以下
组合框:

var combobox = $("#combobox").kendoComboBox({
    dataTextField : "ProductName",
    dataValueField: "ProductID",
    dataSource    : {
        type     : "odata",
        transport: {
            read: "http://demos.kendoui.com/service/Northwind.svc/Products"
        }
    }
}).data("kendoComboBox");
(您可以自己使用它,因为它指的是剑道UI服务器中可用的服务)

然后,您可以使用以下代码来设置
文本
(任意选择)

阅读时,你应该使用:

alert("Current text/value: " + combobox.text() + "/" + combobox.value());

这两种方法都很好,您可以在这里签入。

我在重新绑定剑道组合框时遇到了这个问题。基本上,我必须重新查询服务器,就好像用户输入了一样。然后,一旦查询完成,我就使用前面选择的值选择正确的项

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 :(
    }
});
希望这足够清楚,我已经修改了内联代码以保护inocent,因此可能会有最轻微的语法错误


请记住,在控件的选项(设置)中使用的过滤器应与重新查询时使用的过滤器相同,以简化操作,否则会有多个过滤器进入服务器。

您必须在a**中真正启动该过滤器才能使其正常工作。有一百万种配置,其中只有少数几个似乎有效

WebAPI OData实现(4.5)和Telerik数据源确实不能很好地结合在一起。下面是我的工作客户端组合框实现:

$("#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;
                            },
                        }
                    }
                });
$(“#dropdownlist”).kendoComboBox({
optionLabel:“”,
dataTextField:“名称”,
dataValueField:“id”,
数据源:{
是的,
运输:{
阅读:{
url:“/odata/MyService”,
“type”:“Get”
}
},
模式:{
解析:(响应:任意)=>{
var结果=响应值;
var项目:任何=[];
对于(var i=0;i
您会注意到,我必须劫持schema对象中parse方法中的数据并对其进行处理

我的OData回复供参考:


将:serverPaging:true、serverSorting:true、serverFiltering:true、pageSize:3添加到数据源中,这样您就不会因为返回所有内容而违背odata的目的。现在您会注意到,当您将该值设置为4时,它只显示文本“4”,而不是使用odata命令查找它还没有的值。如果数据源的数据缓存中有该值,则一切都会正常工作,但一旦数据源没有该值,控件就不会自动加载它。从您最初的问题来看,您似乎只知道
,而不知道
文本
。是这样吗?如果您也知道文本,可以使用
combobox.search(“厨师安东的卡津调味品”)我不知道。组合/下拉控件应自动获取给定的值,并在数据源中查找。如果数据源在它的当前数据集中找不到它,它应该在它的缓存中查找以前对同一密钥的请求。如果仍然找不到,它应该使用$filter自动执行查找。它应该查看设置的值,确定它是guid、字符串还是数字,并适当设置$filter子句的格式。如果serverfiltering:true,则应自动执行此操作。我希望有人对如何解决这一缺陷有一些想法…有人对如何强制加载正确的数据对象有什么想法吗?在这种情况下应该自动加载?抱歉-这是一个typescript实现-删除:any“for vanilla javascript
$("#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;
                            },
                        }
                    }
                });