2

私はhttp://jsfiddle.net/ksCSn/1/を持っています

HTML

<input type="text" data-bind="                                                                             
value: title,
hasfocus: edit,
onEnter: stopEdit" />

<p data-bind="text: title"></p>

JS

ko.bindingHandlers.onEnter = {
    init: function(element, valueAccessor, _, viewModel) {
        ko.utils.registerEventHandler(element, 'keydown', function(evt) {
            if (evt.keyCode === 13)
                valueAccessor().call(viewModel);
        });
    }
}

function ViewModel() {
    this.title = ko.observable("default value");
    this.edit = ko.observable(false);
    this.stopEdit = function() {
        this.edit(false);

        // If the edit update is in a timeout, then it works
        // var edit = this.edit;
        // setTimeout(function() { edit(false); }, 0);
    };
}

ko.applyBindings(new ViewModel());

入力欄で編集中にEnterキーを押しても値が更新されないのはなぜですか?

そして、タイムアウトとしてキューに入れられるように編集の更新を変更すると、機能します。何故ですか?

4

3 に答える 3

8

これは、すべてのバインディングが一緒に更新されるKnockout ( https://github.com/SteveSanderson/knockout/issues/321を参照) の「バグ」によるものです。editプロパティを変更すると、hasfocusバインディングが更新されてフィールドがぼやけ、バグのためにvalueバインディングも更新されます。バインディングはリストされた順序で実行されるため、バインディングが最初に更新され、ビュー モデルvalueの値でフィールドが上書きされます。title

これを修正する簡単な変更は、hasfocus最初に実行されるようにバインディングの順序を変更することです: http://jsfiddle.net/mbest/ksCSn/8/

于 2012-09-12T20:29:13.133 に答える
0

Enter キーを押すときは Blur を使用する必要があります。JS Fiddleを調整しました

しかし、値を変更するためにEnterキーを押すのではなく、別のイベントを使用して値を更新しようとする必要がありますか? 例afterkeydown : Js Fiddle

KnockoutJS のドキュメントも参照してください

于 2012-09-12T09:05:23.633 に答える
0

ValueAccessor は、バインディングに渡した内容に応じて、プレーン プロパティまたは ko.observable のいずれかに評価される関数です。

あなたの例では、 stopEdit 関数を渡しているため、次のようになります。

valueAccessor().call(viewModel)

に等しい

viewModel.stopEdit.call(viewModel)

ビューモデルを関数に渡すと、スコープがこれからビューモデルにリセットされます。あなたの例では、これはビューモデルの編集プロパティを効果的にfalseに設定するため、これを次のように書くこともできます

viewModel.edit(false);

ここでの問題は、イベントを混同していることです。この問題に取り組むためのより良いアプローチについては、U10 の回答を参照してください。

于 2012-09-12T08:46:08.783 に答える