我对自定义绑定有疑问。
以下是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!
答案 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()会评估所有绑定,并会导致稍后在每次更改时调用更新。