Kendo-Knockout:将“selected”viewmodel属性绑定到grid

时间:2013-03-27 10:24:21

标签: knockout.js kendo-ui kendo-grid

我正在使用RPNiemeyer的kendo-knockout库将我的viewmodel与我的KendoUI网格绑定。我想要做的是订阅网格的更改事件,以便我可以更新相应的viewmodel项。

我绑定了一个observableArray,其对象是这样的:

{
  Address: "Street name"
  ClientNumber: 1337
  NamePartner: "Client name"
  Selected: false
}

现在,我希望在选择相应的行(KendoUI网格的更改事件)时将Selected属性设置为true。为此,我想我应该使用Knockoutjs自定义绑定处理程序。

我发现这个http://jsfiddle.net/D3rSk/155/,就是这样做了。唯一的问题是这个例子在我的控制台中给出了一些错误,它也绑定了一个单独的'selectedItem'可观察对象,而我想将它绑定到我的observableArray中的属性。

提前致谢。

1 个答案:

答案 0 :(得分:5)

做你想做的事并不是完全无缝的,但你可以这样做:

  • change事件
  • 添加处理程序
  • 使用网格的select方法
  • 获取所选的行元素 来自row元素的
  • 使用网格的dataItem方法
  • 获取数据项
  • 此dataItem是一个干净的对象,因此请使用其唯一键(在您的情况下为ClientNumber)并使用它来查找observableArray中的原始项。

类似的东西:

<div id="grid" data-bind="kendoGrid: { data: items, sortable: true, selectable: true, change: updateSelected, columns: ['Address', 'ClientNumber', 'NamePartner'], widget: grid }"></div>

在您的视图模型上使用updateSelected方法,如:

updateSelected: function() {
    var grid = viewModel.grid(),
        row = grid.select(),
        clientNumber = grid.dataItem(row).ClientNumber,
        actualItem = ko.utils.arrayFirst(viewModel.items(), function(item) {
           return item.ClientNumber === clientNumber;
        });

    if (actualItem) {
        actualItem.Selected = true;

        if (viewModel.previouslySelected) {
            viewModel.previouslySelected.Selected = false;   
        }

        viewModel.previouslySelected = actualItem;
    }            

    return true;
}

示例:http://jsfiddle.net/rniemeyer/7MXfj/

您可以考虑尝试将此逻辑移动到将添加到kendoGrid绑定旁边的自定义绑定中。