3

これが私のコードです。

    <input type="text" placeholder="Add New Tag" data-bind="value: tagToAdd, valueUpdate: 'afterkeydown', event: { keypress: addOnEnter }" />

これが私のノックアウトコードです。

    self.addOnEnter = function (event) {

        console.log(event.which);

        var keyCode = (event.which ? event.which : event.keyCode);
        if (keyCode === 13) {
            self.addTag();
        }
        return true;
    };

入力フィールドに何かを入力すると、イベントがログに記録され、未定義の状態が返されます。どのイベントが発生したかをキャッチできない理由がわかりません。

jsFiddle で私のコードをテストできます。 http://jsfiddle.net/GBLNR/6/

入力フィールドに何か入力するだけで、コンソールから結果を確認できます。

4

2 に答える 2

4

Knockout は、現在のデータ コンテキストを最初の引数としてハンドラーに渡します。はevent2 番目の引数です。

したがって、関数の署名は次のようにする必要があります。

self.addOnEnter = function(data, event) {

}

または、これを処理する良い方法は、次のようなカスタム バインディングを使用することです。

//a custom binding to handle the enter key (could go in a separate library)
ko.bindingHandlers.enterKey = {
    init:function (element, valueAccessor, allBindingsAccessor, data, context) {
        var wrappedHandler, newValueAccessor;

        //wrap the handler with a check for the enter key
        wrappedHandler = function (data, event) {
            if (event.keyCode === 13) {
                valueAccessor().call(this, data, event);
            }
        };

        //create a valueAccessor with the options that we would want to pass to the event binding
        newValueAccessor = function () {
            return { keyup:wrappedHandler };
        };

        //call the real event binding's init function
        ko.bindingHandlers.event.init(element, newValueAccessor, allBindingsAccessor, data, context);
    }
};

これで、関数に対してこのenterKeyバインドを使用するだけで、データを処理するだけで済みます。addOnEnter

于 2012-10-31T03:13:11.127 に答える