2013-04-20 4 views
6

Lange Rede kurzer Sinn, ich möchte Benutzern ermöglichen, Eingabe auf einem Eingabeelement zu drücken und bestimmte Methode in meinem Viewmodel aufgerufen werden. Hier ist mein html-Eingang:Knockout Ereignisbindung für Eingabe keypress verursacht seltsames Verhalten

<input id="searchBox" class="input-xxlarge" type="text" data-bind="value: searchText, valueUpdate: 'afterkeydown', event: { keypress: $parent.searchKeyboardCmd}"> 

und hier ist meine Methode in vm:

searchKeyboardCmd = function (data, event) { if (event.keyCode == 13) searchCmd(); }; 

funktioniert alles einwandfrei und searchCmd aufgerufen wird, wenn ich bei der Eingabe drücken Sie die Eingabetaste, aber das Problem ist, dass ich geben kann nichts in der Eingabe, dh alles, was ich in Eingabe tippe, wird ignoriert. Vielen Dank im Voraus für Ihre Hilfe.

Antwort

20

Gemäß KO-Dokumentation müssen Sie true von Ihrem Event-Handler zurückgeben, wenn die Standardaktion fortgesetzt werden soll.

searchKeyboardCmd = function (data, event) { 
    if (event.keyCode == 13) searchCmd(); 
    return true; 
}; 
+0

Nun, vielen Dank f_martinez! Es funktioniert jetzt perfekt, obwohl ich nicht verstehe, warum das nötig war! – Pejman

1

here's eine Geige, das zeigt, was ur versucht, mit keyup in ur-Code zu tun, und auch ersetzen Veranstaltung ‚keypress‘ und $ parent entfernen mit nur den Funktionsnamen, wenn das Textfeld in einem Knockout foreach loop..here ist ist der unten modifizierte Code

<input id="searchBox" class="input-xxlarge" type="text" data-bind="value: searchText, valueUpdate: 'afterkeydown', event: { keyup: searchKeyboardCmd}" 
+0

Das war die Antwort, die mir geholfen hat, weil es nicht auf den Enter oder Keycode == 13 angewiesen ist – Sanchitos

2

Hier ist ein funktionierendes Beispiel.

http://jsfiddle.net/tlarson/qG6yv/

<!-- ko with: stuff --> 
    <input id="searchBox" class="input-xxlarge" type="text" 
    data-bind="value: searchText, valueUpdate: 'afterkeydown', 
    event: { keypress: $parent.searchKeyboardCmd}"> 
<!-- /ko --> 

Und das javascript:

var stuffvm = function(){ 
    var self = this; 

    self.searchText = ko.observable(); 
}; 

var vm = function() { 
    var self = this; 

    self.stuff = new stuffvm(); 

    self.searchCmd = function() { 
     console.log("search triggered"); 
    }; 

    self.searchKeyboardCmd = function (data, event) { 
     if (event.keyCode == 13) { 
      self.searchCmd(); 
     } 
     return true; 
    } 
} 

ko.applyBindings(new vm());