在分页上为Kendo Grid重新应用Knockout Bindings

时间:2014-12-02 22:10:28

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

目前我的Kendo网格的分页/过滤存在问题。我的网格是非常标准的,6列,4个字面上只是从模型中吐出数据,2个显示来自模型的数据,但有一个Kendo工具提示应用了敲除绑定。我遇到的问题特别是工具提示MVVM绑定。它们可以很好地处理第一页数据,但是当您转到第二页或过滤网格时,工具提示不会出现。

我已经缩小了那里的问题,当绑定应用于页面时,新行的新html不存在。将绑定重新应用到新的html的简单问题吧?错误。这是我确定的解决方案,但我无法弄清楚如何实现它作为其生成新HTML的Kendo,我无法找到一种方法来拦截它并抓住新的html重新应用绑定。

我假设解决方案会涉及到这样的事情:

self.interceptPaging = function(e) {
    var newElements = e.sender.content;
    ko.applyBindingsToNode(newElements[0], null, viewModel);
}

但是我从哪里获取新元素?因此,e.sender.content会抛出有关绑定网格两次的错误。建议欢迎!

请参阅我的Fiddle了解我的问题的实例。

更新

由于jsFiddle似乎在使用knockout 3.2时遇到了问题,我将其插入Telerik的道场:Here

更新#2:解决方案

找到解决方案。在上面的数据绑定函数之上,我不得不添加一个自定义绑定处理程序来禁用后代绑定。

ko.bindingHandlers.allowBindings = {
    init: function (elem, valueAccessor) {
        // Let bindings proceed as normal *only if* my value is false
        var shouldAllowBindings = ko.unwrap(valueAccessor());
        return { controlsDescendantBindings: !shouldAllowBindings };
    }
};

我将此属性添加到kendo网格div。

<div data-role="grid"
     data-bind="kendoGrid: gridOptions, allowBindings: false "
     style="height: 500px">
</div>

我还必须在上面的applyBindings调用之前调用ko.cleanNode。所以我的数据绑定功能看起来像:

self.dataBound = function (e){
    var body = e.sender.element.find("tbody")[0];

    if (body) {
        ko.cleanNode(body);
        ko.applyBindings(ko.dataFor(body), body);
    }        
};

查看更新的Telerik Dojo

1 个答案:

答案 0 :(得分:1)

你是对的。 Kendo在页面上引入了新元素,而淘汰赛并不知道它需要应用绑定。

您可以利用dataBound事件:

dataBound: function(){
     var body = this.element.find("tbody")[0];

     if (body) {
        ko.applyBindings(ko.dataFor(body), body);   
     }}
}

我已经更新了你的小提琴。

http://jsfiddle.net/oe3nrk8f/2/

另外,看看这个问题,看看你如何修改kendo-knockout库的源代码来自动为你做这件事,但这可能有点过头了。

https://stackoverflow.com/a/13863191/4316646