我有一个关于自定义绑定(bind)的问题。
这是fiddle
在那里你可以看到我有 4 个自定义绑定(bind)...每个人都绑定(bind)到相同的 bool 值,但每个绑定(bind)都会以不同的方式触发。
这是一个错误吗?
这太棒了post说它在 3.x 中已修复...我正在使用 3.1.0,但它似乎没有修复。
我的具体问题是: 我想要一个自定义绑定(bind),只有在模型更改时才会触发该绑定(bind),而在另一个绑定(bind)发生更改时则不会触发。 (将四个绑在 fiddle 上)
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());
}
};
只要看看 fiddle 并运行它......它说明了一切;)
<input data-bind="value: test, valueUpdate: 'afterkeydown', customFour: test2" />
<input type="checkbox" data-bind="checked: test2" />
有人可以向我解释一下这种行为吗? 谢谢!
最佳答案
update
函数在 ko.compulated
中调用,因此将监视您在该函数中读取的任何可观察值。要真正“绑定(bind)”到可观察对象,您需要在 update
函数中获取它的值。通常这样做的方法是这样的:
var value = ko.unwrap(valueAccessor());
使用 ko.unwrap
可以灵活地使用绑定(bind),允许您提供可观察值或直接值(例如,来自表达式)。
如果您在 update
函数中访问另一个绑定(bind)的值,则只要该值发生更改,您的绑定(bind)也会更新。您可以使用peek
来避免这种情况。
关于allBindingsAccessor
,在3.0中已更改为include get
and has
methods这可以让您更好地管理您正在访问的绑定(bind)值。
allBindings.get('value')
关于javascript - knockout : custom binding fired multiple times and on the wrong binding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25360510/