javascript - knockout : custom binding fired multiple times and on the wrong binding

标签 javascript knockout.js

我有一个关于自定义绑定(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/

相关文章:

javascript - 如何使用 Angular ng include 在 symfony 中加载 twig 文件

javascript - 发生未捕获的异常时重新启动 Node.js 应用程序

javascript - 不使用按钮显示列表,带 knockout

javascript - 如何在 GreaseMonkey 中插入 Javascript 代码而不是 Head

javascript - 在成功调用 ajax 后使用 jQuery 将类添加到元素

使用 Excel VBA 在 Chrome 中注入(inject) Javascript

javascript - KnockoutJS - 不能将 "Slice"与 ko.computed 对象一起使用

javascript - Knockout JS - 如何正确绑定(bind) observableArray

javascript - knockout.js 将样式应用于下拉选项

javascript - 识别可观察对象更新程序的最佳方法是什么