Knockout.js 在分页时为剑道网格重新应用敲除绑定

Knockout.js 在分页时为剑道网格重新应用敲除绑定,knockout.js,kendo-ui,kendo-grid,Knockout.js,Kendo Ui,Kendo Grid,当前我的剑道网格分页/筛选有问题。我的网格非常标准,有6列,4列从模型中吐出数据,2列显示模型中的数据,但有一个剑道工具提示应用了击倒绑定。我遇到的问题是工具提示MVVM绑定。它们在处理第一页数据时非常有效,但是当您转到第二页或过滤网格时,工具提示不会出现 我已经缩小了问题的范围,当绑定应用到页面时,新行的新html不存在。将绑定重新应用到新html的简单问题,对吗?错。我确信这就是解决方案,但我不知道如何实现它,因为它的剑道正在生成新的HTML,我也不知道如何拦截它并获取新的HTML以重新应用

当前我的剑道网格分页/筛选有问题。我的网格非常标准,有6列,4列从模型中吐出数据,2列显示模型中的数据,但有一个剑道工具提示应用了击倒绑定。我遇到的问题是工具提示MVVM绑定。它们在处理第一页数据时非常有效,但是当您转到第二页或过滤网格时,工具提示不会出现

我已经缩小了问题的范围,当绑定应用到页面时,新行的新html不存在。将绑定重新应用到新html的简单问题,对吗?错。我确信这就是解决方案,但我不知道如何实现它,因为它的剑道正在生成新的HTML,我也不知道如何拦截它并获取新的HTML以重新应用绑定

我假设解决方案包括以下内容:

self.interceptPaging = function(e) {
    var newElements = e.sender.content;
    ko.applyBindingsToNode(newElements[0], null, viewModel);
}
但是我从哪里获得新元素呢?实际上,e.sender.content在绑定网格两次时抛出一个错误。欢迎您的建议

有关我的问题的工作示例,请参阅

更新:

由于JSFIDLE在使用击倒3.2时似乎遇到了问题,我将其插入Telerik的dojo中:

更新#2:解决方案


找到了解决办法。在上面的databound函数之上,我必须添加一个自定义绑定处理程序来禁用子体绑定

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 };
    }
};
我将这个属性添加到剑道网格div中

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

见更新

你完全正确。Kendo在页面上引入了新元素,knockout不知道它需要应用绑定

您可以利用数据绑定事件来执行以下操作:

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

     if (body) {
        ko.applyBindings(ko.dataFor(body), body);   
     }}
}
我在下面更新了你的小提琴

另外,看看这个问题,看看如何修改剑道击倒库的源代码来自动为您执行此操作,但这可能有点过头了


这在JSFIDLE 2.2版的knockout中非常有效,但是当我将它拉到运行3.2版knockout的应用程序中时,会出现“无法将绑定多次应用于同一元素”错误。我用2.2来击倒对手,因为3.2给我带来了小提琴方面的问题。我不得不去Telerik dojo,以获得我面对淘汰赛3.2的一个例子。有什么建议吗?我一整天都在想这个问题,找到了解决办法。在上面的databound函数之上,我必须添加一个自定义绑定处理程序来禁用子体绑定。我将此属性添加到剑道网格分区。在上面的applyBindings调用之前,我还必须调用ko.cleanNode。见更新的Telerik Dojo。这真是太好了。谢谢你的更新,很高兴你把它整理好了。从这个问题来看,如果一个项目绑定了两次,那么knockout 2.0看起来会返回null。在版本2.3中,他们更新了这个,以抛出一个错误,因为您不应该绑定两次。然而,在这种情况下,网格被绑定一次与剑道,第二次是与击倒。所以有两个绑定,但有两种不同的类型。
dataBound: function(){
     var body = this.element.find("tbody")[0];

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