How can I get Knockout JS to data-bind on keypress instead of lost-focus?

javascript, knockout.js

Solution

<body>
        <p>First name: <input data-bind="value: firstName, valueUpdate: 'afterkeydown'" /></p>
        <p>Last name: <input data-bind="value: lastName, valueUpdate: 'afterkeydown'" /></p>
        <h2>Hello, <span data-bind="text: fullName"> </span>!</h2>
</body>

From the documentation

Additional parameters

valueUpdate

If your binding also includes a parameter called valueUpdate, this defines which browser event KO should use to detect changes. The following string values are the most commonly useful choices:

"change" (default) - updates your view model when the user moves the focus to a different control, or in the case of elements, immediately after any change

"keyup" - updates your view model when the user releases a key

"keypress" - updates your view model when the user has typed a key. Unlike keyup, this updates repeatedly while the user holds a key down

- "afterkeydown" - updates your view model as soon as the user begins typing a character. This works by catching the browser’s keydown event and handling the event asynchronously.

Of these options, "afterkeydown" is the best choice if you want to keep your view model updated in real-time.

Problem

This example of knockout js works so when you edit a field and press TAB, the viewmodel data and hence the text below the fields is updated. How can I change this code so that the viewmodel data is updated every keypress? ``` <!doctype html> <html> <title>knockout js</title> <head> <script type="text/javascript" src="js/knockout-1.1.1.debug.js"></script> <script type="text/javascript"> window.onload= function() { var viewModel = { firstName : ko.observable("Jim"), lastName : ko.observable("Smith") }; viewModel.fullName = ko.dependentObservable(function () { return viewModel.firstName() + " " + viewModel.lastName(); }); ko.applyBindings(viewModel); } </script> </head> <body> <p>First name: <input data-bind="value: firstName" /></p> <p>Last name: <input data-bind="value: lastName" /></p> <h2>Hello, <span data-bind="text: fullName"> </span>!</h2> </body> </html> ```

Original source

Related problems