1

これが私の問題を説明する小さなサンプルコードです:http://jsfiddle.net/wsytR/2/

入力のテキストを変更してからTabキーを押してぼかしを入れると、値が古いものに戻ります。throttleこれは、期間が終了する前にフォーカスを切り替えた場合に発生します。観測量はこのようにまったく変化していないように私には思えます。

私はこの質問を見つけ、それからこの問題に到達しました。バインディングを並べ替えてhasfocus最初のバインディングにしましたが、運が悪かったです。

また、タブを押してフォーカスを切り替える代わりに、エスケープを押すか、ページ上の別の場所をクリックすると、古い値が再び復元されますが、スロットル期間が終了すると、オブザーバブルが更新され、値が再び変更されます。今回は新しい値になります。 1。おそらく、タブとエスケープ/クリックによって別の種類のイベントがトリガーされます。

ノックアウトでこれを処理する方法はありますか?私は何か間違ったことをしようとしていますか、それともノックアウトで機能することが期待されるべきではないことをしようとしていますか?

編集:

質問を正しく定式化していないことがわかりました。モデルからフォーカスを設定する必要があるため、バインディングを調整し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 に答える