ko.bindingHandlers.executeOnEnter = { init: function (element, valueAccessor, allBindingsAccessor, viewModel) { var allBindings = allBindingsAccessor(); $(element).keypress(function (event) { var keyCode = (event.which ? event.which : event.keyCode); if (keyCode === 13) { allBindings.executeOnEnter.call(viewModel); return false; } return true; }); } }; $(function() { var viewModel = { // data items: ko.observableArray([]), itemToAdd: ko.observable(""), // behaviors addItem: function() { this.items.push({ name: this.itemToAdd() }); this.itemToAdd(""); } }; ko.applyBindings(viewModel); });
<input type="text" data-bind="value: itemToAdd, valueUpdate: 'afterkeydown', executeOnEnter: addItem" /> <button data-bind="click: addItem">Add</button> <ul> <!-- ko foreach: items --> <li><span data-bind="text: name"/></li> <!-- /ko --> </ul>