knockoutjs:自定义绑定多次触发并且绑定错误

时间:2014-08-18 09:50:55

标签: javascript knockout.js

我对自定义绑定有疑问。

以下是fiddle

在那里你可以看到我有4个自定义绑定...每个绑定到相同的布尔值,但每个绑定都被不同地触发。

这是一个Bug吗?

这个很棒的post说是固定在3.x ...我使用的是3.1.0,似乎没有修复。

我的具体问题是: 我想要一个自定义绑定,只有在模型更改时才会触发,而如果另一个绑定发生更改则不会触发。 (在小提琴中绑定四个)

ko.bindingHandlers.customFour = {
    update: function(element, valueAccessor, allBindingsAccessor) {
        var value = valueAccessor();
        var allBindings = allBindingsAccessor();
        console.log('customFour: why get i called on value change? I am not a value binding');
        console.log(value());
        console.log(allBindings.value());
    }
};

只要看一下小提琴并运行它......它说是外行;)

<input data-bind="value: test, valueUpdate: 'afterkeydown', customFour: test2" />
<input type="checkbox" data-bind="checked: test2" />

有人可以向我解释这种行为吗? THX!

2 个答案:

答案 0 :(得分:2)

update函数在ko.computed内调用,因此会监视您在该函数中读取的任何可观察对象。要实际“绑定”到observable,您需要在update函数中获取它的值。通常这样做是这样的:

var value = ko.unwrap(valueAccessor());

使用ko.unwrap可以灵活地使用绑定,允许您提供可观察值或直接值(例如,来自表达式)。

如果您在update函数中访问另一个绑定的值,则只要该值发生更改,您的绑定也会更新。您可以使用peek来避免这种情况。

关于allBindingsAccessor,它已在3.0中更改为include get and has methods,可让您更好地管理您正在访问的绑定值。

allBindings.get('value')

答案 1 :(得分:0)

我想调用allBindingsAccessor()会评估所有绑定,并会导致稍后在每次更改时调用更新。