【问题标题】:Knockout - custom foreach binding applying bindings multiple times to the same element淘汰赛 - 自定义 foreach 绑定将绑定多次应用于同一元素
【发布时间】:2015-01-23 23:22:45
【问题描述】:

使用以下自定义绑定,我收到以下内容,但我不知道为什么。

版本 Knockout 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
        });
    }
};

用法

<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>

推理

简而言之,我需要获取一组对象(100 个)并将它们显示在页面上。我使用引导程序,所以我想我会制作一个绑定处理程序,该处理程序将数组接收并根据columns 绑定将其拼接成数组内的较小数组,并在我的视图中整齐地显示它们,如上所示。

数组总是变化的,所以我希望它尽可能是动态的,但是上面的代码在某个地方导致了上述错误。为简洁起见,我没有包含我的 viewModel,因为它是一个标准模型,其中包含一个包含对象的可观察数组。

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    您需要告诉 knockout,您的绑定处理程序将控制后代元素的绑定。它们通过敲除有效地处理了两次,从您致电 applyBindingsToNode() 到通过正常的敲除处理。

    您可以通过使您的init() 函数返回一个将controlsDescendantBindings 属性设置为true 的对象来实现。更多关于 in the documentation.

    ko.bindingHandlers.foreachArraySplice = {
        init: function (element, valueAccessor, allBindings) {
            // ...
            return { controlsDescendantBindings: true };
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2013-03-14
      • 2016-04-29
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多