Kendo网格组合框将未定义的数据发送到DataSource

时间:2013-03-28 20:43:39

标签: javascript kendo-ui kendo-grid

我有一个kendo Grid,其列使用一个组合框,该组合框绑定到名为“Worker”(ID,Workername)的对象。这种方法很好,除非用户将组合框文本设置为与任何下拉选项不匹配的字符串(例如:'xxxx')。组合框将Worker的值设置为字符串('xxxx')而不是Worker对象,此时dataSource在收到格式错误的数据时停止响应。

我已经在dataSource'change'事件中使用它,该事件在网格的'save'事件之后触发。违规的dataItem的属性被变量myWorkerStart覆盖(在网格的编辑事件中捕获):

myDataSource.bind("change", function (e) {
        if (e.field) {
            if (e.field == "Worker") {           
                rowDataItem = myGrid.dataItem(myGrid.tbody.find("tr.k-grid-edit-row"));
                var currentWorker = rowDataItem.Worker;
                var myType = $.type(currentWorker);
                if (myType != "object") {
                    alert('Ooooh, BAD worker, reverting to starting value');
                    rowDataItem.set('Worker', myWorkerStart);
                }
            }
        }
        alert("datasource change");
})

我在Telerik论坛的几个主题中看过这个主题,大部分都没有答案。 Telerik支持告诉我,我应该在网格的'save'事件中解决未定义的值,但是在组合框设置行之前会触发。我可以看到值,但我不确定在哪里可以设置值以防止将未定义的值发送到dataSource(容器,模型)在发送未定义的组合框值之前是否有更好的方法来处理格式错误的数据到网格?

myGrid.bind("save", function (e) {
        myCombo = $('#Worker').data("kendoComboBox");
        rowDataItem = myGrid.dataItem(myGrid.tbody.find("tr.k-grid-edit-row"));          
        myPreviousWorker = e.model.Worker;//Worker previously
        myNewWorker = myCombo.dataItem();//Worker about to be set by selected Combobox.
        if (myNewWorker) {
            alert("GOOD worker");
        } else {
            alert("BAD worker");
        }
        //Manipulate the combobox/container/model values
})

1 个答案:

答案 0 :(得分:2)

Petur Subev 能够提供此答案:jsbin

在具有“批量”保存的网格的示例中,网格的“保存”事件检查组合框中的未定义选择,然后将一次(jquery .one())绑定到模型的更改事件以设置所需的值仅在组合框选择未定义时才在保存期间。

http://jsbin.com/edamuj/649/edit


//grid configuration setup
save:function(e){          
       if(!e.container.find('[data-role=combobox]').data().kendoComboBox.dataItem())
       {
         e.model.one('change',function(e){
             this.set('test',{CategoryName:"Bevarages",CategoryID: "001"}) 
         }) 

       }

       this.refresh();
    }

以下没有批量保存的网格示例(例如内联编辑)只需要在网格保存上触发,不需要额外绑定到模型更改。 Petur的其他jsbin

save:function(e){
       if(!e.container.find('[data-role=combobox]').data().kendoComboBox.dataItem())
       {
           e.model.set('test',{CategoryName:"Bevarages",CategoryID: "001"})
       }

       this.refresh();
    }