覆盖knockout绑定:无法多次应用绑定错误

时间:2017-01-25 15:04:27

标签: javascript knockout.js

淘汰中,我想覆盖默认的foreach绑定:

var foreachInit = ko.bindingHandlers.foreach.init;
ko.bindingHandlers.foreach.init = function () {
    foreachInit.apply(this, arguments);
};

但即使这个简单的片段也会触发错误:

  

您无法多次将绑定应用于同一元素

请参阅小提琴控制台:https://jsfiddle.net/hejdav/wxf51s5L/10/

你知道吗,为什么会这样?

3 个答案:

答案 0 :(得分:1)

我相信你在这里过分思考。创建一个viewModel构造函数,初始化并传递您想要的数据,然后将其存储在observableArray中。



var ViewModel = function(r) {
  // if r exists place it in the observable otherwise it's an empty array
  this.items = ko.observableArray(r || []);
};

var model = new ViewModel([1, 2]);
ko.applyBindings(model);

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<p data-bind="foreach: items">
  <span data-bind="text: $data"></span>
</p>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

因为在您的HTML中,您有另一个文本绑定,删除该范围并解决您的问题。 或者你应该告诉Knockout你将自己控制后代绑定。 http://knockoutjs.com/documentation/custom-bindings-controlling-descendant-bindings.html

答案 2 :(得分:0)

为避免发生错误,请大声从{ controlsDescendantBindings: true }返回init,所以:

var foreachInit = ko.bindingHandlers.foreach.init;
ko.bindingHandlers.foreach.init = function () {
    foreachInit.apply(this, arguments);

    return {
        controlsDescendantBindings: true
    };
};

ko.applyBindings({
    items: ['A', 'B'],
});

https://jsfiddle.net/hejdav/6sar9ftv/3/