Knockout - 自定义 foreach 绑定多次将绑定应用于同一元素
Knockout - custom foreach binding applying bindings multiple times to the same element
使用以下自定义绑定,我收到以下信息,但我不明白为什么。
版本 Knockout JavaScript library v3.2.0
You cannot apply bindings multiple times to the same element.
绑定
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 个)并将它们显示在页面上。我使用 bootstrap 所以我想我会制作一个绑定处理程序,它获取数组并根据 columns
绑定将其拼接成数组中的较小数组,并在我的视图中整齐地显示它们,如上所示。
数组总是不同的,所以我希望它尽可能是动态的,但上面的代码在某处导致了上述错误。为简洁起见,我没有包括我的 viewModel,因为它是一个标准模型,带有一个包含对象的可观察数组。
您需要告诉 knockout 您的绑定处理程序将控制后代元素的绑定。它们实际上被敲除处理了两次,从您对 applyBindingsToNode()
的调用到正常的敲除处理。
您可以通过将 init()
函数 return 设为 controlsDescendantBindings
属性 设置为 true
的对象来实现。更多关于 in the documentation.
ko.bindingHandlers.foreachArraySplice = {
init: function (element, valueAccessor, allBindings) {
// ...
return { controlsDescendantBindings: true };
}
};
使用以下自定义绑定,我收到以下信息,但我不明白为什么。
版本 Knockout JavaScript library v3.2.0
You cannot apply bindings multiple times to the same element.
绑定
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 个)并将它们显示在页面上。我使用 bootstrap 所以我想我会制作一个绑定处理程序,它获取数组并根据 columns
绑定将其拼接成数组中的较小数组,并在我的视图中整齐地显示它们,如上所示。
数组总是不同的,所以我希望它尽可能是动态的,但上面的代码在某处导致了上述错误。为简洁起见,我没有包括我的 viewModel,因为它是一个标准模型,带有一个包含对象的可观察数组。
您需要告诉 knockout 您的绑定处理程序将控制后代元素的绑定。它们实际上被敲除处理了两次,从您对 applyBindingsToNode()
的调用到正常的敲除处理。
您可以通过将 init()
函数 return 设为 controlsDescendantBindings
属性 设置为 true
的对象来实现。更多关于 in the documentation.
ko.bindingHandlers.foreachArraySplice = {
init: function (element, valueAccessor, allBindings) {
// ...
return { controlsDescendantBindings: true };
}
};