Friday, May 4, 2012

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


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?



alt text




<!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>


Source: Tips4all

1 comment:

  1. <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.

    ReplyDelete