1

这是一个说明我的问题的小示例代码:http: //jsfiddle.net/wsytR/2/

如果您更改输入中的文本,然后按 Tab 使其模糊,则该值将变回旧值。如果您在throttle期间结束之前切换焦点,就会发生这种情况。在我看来,observable 并没有以这种方式发生变化。

我发现了这个问题,并从中得到了这个问题。我重新排序了绑定,所以这hasfocus是第一个,但没有运气。

此外,如果不是按 Tab 键切换焦点,而是按 Escape 或单击页面上的其他位置,旧值会再次恢复,但在节流期到期后,可观察值会更新并且值再次更改,这次是新值一。tab 和 Escape/click 可能会触发不同类型的事件。

有没有办法通过淘汰赛来处理这个问题?我是否试图做错事或不应该在淘汰赛中发挥作用的事情?

编辑:

原来我没有正确地提出我的问题。我需要从我的模型中设置焦点,因此限制hasfocus绑定并不能解决我的问题。如果您只需要在离开元素后正确更新它但仍然保持油门,那效果很好。

我的目标是在失去焦点时立即更新,否则会在输入前限制绑定。

4

1 回答 1

0

淘汰赛中的内置油门扩展器就像它的名字所说的那样:它限制更新。看来我想做点别的。在模糊字段时立即更新值,但在键入时会限制输入。

我最终想出的解决方案是调整内置油门扩展器并将其添加为自定义扩展器:

ko.extenders.smart_throttle = function(target, timeout) {
    target['throttleEvaluation'] = timeout;
    target['lastUpdatedValue'] = null;

    var writeTimeoutInstance = null;
    return ko.computed({
        'read': target,
        'write': function(value) {
            if (value == target()) {
                clearTimeout(writeTimeoutInstance);
                target(target['lastUpdatedValue']);
                return;
            }

            clearTimeout(writeTimeoutInstance);
            target['lastUpdatedValue'] = value;
            writeTimeoutInstance = setTimeout(function() {
                target(value);
            }, timeout);
        }
    });
}

Akshat 的回答仍然是我最初问题的完美解决方案。很抱歉没有正确地制定它。

于 2013-02-08T15:28:06.813 回答