3

次の簡単な例を考えてみましょう。

<input data-bind="value: query, valueUpdate: 'afterkeydown'"/>

knockoutjs 2.1.0 では、ctrlUp arrowDown arrowのいずれかを押してもShiftバインディングが起動されquery、更新されません。

knockoutjs 2.2.0 では、上記のすべてのキー押下に対してバインディングが起動します。

これは、いくつかの既存のコードに大混乱をもたらしています (これはオートコンプリートであり、ドロップダウンから選択するために上下矢印が頻繁に使用されます)。

正しい動作はどれですか? これらのキーを押すことキーダウンイベントであるため、技術的には後者が正しいと思いますが、値が変更された場合にのみバインディングが起動するべきではありませんか?

すべてをリアルタイムで維持したいのですが、ドキュメントの状態は次のとおりです。

ビューモデルをリアルタイムで更新したい場合は、「afterkeydown」が最適です。

提案?

4

2 に答える 2

3

私は上記の方法に従いましたsubscribeが、それは少し厄介で、ノックアウトの精神ではないようでした。同僚は、変更がない場合にバインディングを抑制するエクステンダーを作成することを提案しました(これは2.1の動作をエミュレートします)。

ko.extenders.suppressNoChange= function(target) {
    var result = ko.computed({
        read: target,
        write: function(newValue) {
            var current = target();
            if (newValue!== current) {
                target(newValue);
            }
        }
    });
    result(target());
    return result;
};

これで、変更が発生しなかった場合にバインディングが起動しないように、計算されたオブザーバブルを拡張できます。

次のように使用できます。

ko
  .computed({
     read: function(){},
     write: function(v){})
  .extend({
     suppressNoChange: null
  });

そして、2.1の動作を復元するために、質問の2.2フィドルに最小限の変更を加えることができます。

http://jsfiddle.net/Rmcza/26/を参照してください

于 2012-11-23T18:40:32.260 に答える
1

これは、 9月にRP Niemeyerによって行われたこの変更の結果だと思います。これにより、値が変更されていない場合でも、トリガーされたときに計算されたオブザーバブルが常に書き込まれます。

このフィドルでは、計算されていないオブザーバブルを使用している場合、これは発生しないことに気付くでしょう。明示的なサブスクリプションを使用してこれをテストしましたが、下向き矢印でイベントが発生しません。

this.test = ko.observable('');
this.test.subscribe(function(newValue) {
    alert("The test value new name is " + newValue);
});

おそらくライアンは、これが変更された理由と、この場合、計算されたものが通常のオブザーバブルとは異なる動作をしている理由を説明できます。GitHubページで問題を作成することをお勧めします。

于 2012-11-22T06:57:30.450 に答える