Knockout.js 敲除-自定义foreach绑定将绑定多次应用于同一元素

Knockout.js 敲除-自定义foreach绑定将绑定多次应用于同一元素,knockout.js,Knockout.js,使用下面的自定义绑定,我收到了下面的内容,我不知道为什么 版本淘汰JavaScript库v3.2.0 不能对同一元素多次应用绑定 绑定 ko.bindingHandlers.foreachArraySplice = { init: function (element, valueAccessor, allBindings) { var value = ko.unwrap(valueAccessor()); var columns = allBindings

使用下面的自定义绑定,我收到了下面的内容,我不知道为什么

版本淘汰JavaScript库v3.2.0

不能对同一元素多次应用绑定

绑定

ko.bindingHandlers.foreachArraySplice = {
    init: function (element, valueAccessor, allBindings) {
        var value = ko.unwrap(valueAccessor());
        var columns = allBindings.get('columns') || 1;

        /* Split the array into splices */
        var len = value.length;
        var splitArray = [];
        var i = 0;
        while (i < len) {
            var size = Math.ceil((len - i) / columns--);
            splitArray.push(value.slice(i, i + size));
            i += size;
        }
        /*\Split the array into splices */
        ko.cleanNode(element); // Last attempted fix...
        ko.applyBindingsToNode(element, {
            foreach: splitArray
        });
    }
};
ko.bindingHandlers.foreachArraySplice={
init:函数(元素、valueAccessor、allBindings){
var value=ko.unwrap(valueAccessor());
var columns=allBindings.get('columns')| | 1;
/*将阵列拆分为拼接*/
var len=value.length;
var splitArray=[];
var i=0;
而(我
用法

<div class="row" data-bind="foreachArraySplice: anArray, columns: 5">
  <div class="col-md-2" data-bind="foreach: $data, css: { first: $index == 0, last: $index == $data.length }">
    <div class="input-group" style="margin-bottom: 5px;">
      <input class="form-control input-sm" type="text" data-bind="value: $data.key" readonly>
    </div>
  </div>
</div>

推理

ko.bindingHandlers.foreachArraySplice = {
    init: function (element, valueAccessor, allBindings) {
        var value = ko.unwrap(valueAccessor());
        var columns = allBindings.get('columns') || 1;

        /* Split the array into splices */
        var len = value.length;
        var splitArray = [];
        var i = 0;
        while (i < len) {
            var size = Math.ceil((len - i) / columns--);
            splitArray.push(value.slice(i, i + size));
            i += size;
        }
        /*\Split the array into splices */
        ko.cleanNode(element); // Last attempted fix...
        ko.applyBindingsToNode(element, {
            foreach: splitArray
        });
    }
};
简而言之,我需要获取一个对象数组(100个)并将它们显示在页面上。我使用bootstrap,所以我想我应该制作一个绑定处理程序,根据
绑定将数组拼接成数组中的较小数组,并在我的视图中整齐地显示它们,如上图所示


数组总是不同的,所以我希望它尽可能是动态的,但是上面的代码导致了前面提到的错误。为简洁起见,我没有包括viewModel,因为它是一个标准模型,具有包含对象的可观察数组。

您需要告诉knockout,您的绑定处理程序将控制子元素的绑定。从您对
applybindingstoode()
的调用到正常的敲除处理,敲除会有效地处理它们两次

通过使
init()
函数返回属性设置为
true
ControlsDescentBindings
对象,可以实现这一点。更多关于这个