knockoutjs submit binding

Having a problem getting the submit binding to respond to the enter key properly. Response triggers cancel event rather than update.

HTML

<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/base/jquery-ui.css">
<script src="http://rniemeyer.github.com/KnockMeOut/Scripts/jquery.tmpl.js"></script>
<script src="https://raw.github.com/SteveSanderson/knockout/master/build/output/knockout-latest.debug.js"></script>
<!-- ko with: dialog -->
<div id="taskdlg" class="resizeableDialog" 
    data-bind="dialog: {autoOpen: false, title: 'Edit task', height: 200, width: 500, modal: true, close: onClose}, openWhen: open">
    <form data-bind="submit: update">
        <div>
        <ul>
            <li>Edit title</li>
            <li>Press ESC, (x) in title, or the Cancel button to close</li>
            <li>Press ENTER or the Save button to save.</li>
            <li>(ENTER doesn't work; equivalent to Cancel button)</li>
        </ul>
        </div>
        <table>
            <tr>
                <td style="width: 100px;"><label for="tasktitle">Title</label></td>
                <td width="*">
                    <input id="tasktitle" type="text" placeholder="Task name" data-bind="value: titletext, valueUpdate: 'afterkeydown'" />
                </td>
            </tr>
            <tr>
                <td><button style="float: left;" type="button" data-bind="click: cancel">Cancel</button></td>
                <td><button data-bind="text:abc" style="float: right;" type="submit"></button></td>
            </tr>
        </table>
    </form>
</div>
<!-- /ko -->
                    

<button data-bind="click: editTask">Edit</button>
<span data-bind="text: task"></span>

CSS

body {
    font-family: sans-serif;
    font-size: 12px;
}

table {
    margin-top: 10px;
}

JavaScript

ko.bindingHandlers.dialog = {
        init: function(element, valueAccessor, allBindingsAccessor) {
            var options = ko.utils.unwrapObservable(valueAccessor());
            setTimeout(function() { $(element).dialog(options || {}); }, 0);

            //handle disposal (not strictly necessary in this scenario)
             ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
                 $(element).dialog("destroy");
             });   
        },
        update: function(element, valueAccessor, allBindingsAccessor) {
             var shouldBeOpen = ko.utils.unwrapObservable(allBindingsAccessor().openWhen);
             $(element)
                 .dialog(shouldBeOpen ? "open" : "close");
        }
};

function Task(name) {
    var self = this;
    this.title = ko.observable(name);
    
    this.toString = function() { return "Task: " + self.title(); };
}

function TaskDialog(viewModel) {
    var self = this;

    this.viewModel = viewModel;
    this.task = ko.observable();
    this.open = ko.observable(false);
    this.titletext = ko.observable();
    this.append = function(text) {
         console.log(text);
    }

    this.editTask = function(task) {
        self.task(task);
        self.titletext(task.title());
        self.open(true);
    }
    
    this.update = function() {
        self.append("Update");
        var task = self.task();
        task.title(self.titletext());
        self.open(false);
        self.append("updated: title=" + task.title());
    }
    
    this.onClose = function() {
        if (self.open()) {
            self.open(false);
            self.append("in onClose handler; closing");
        }
//        return true;
    }
    
    this.cancel = function() {
        self.open(false);
        self.append("cancel pressed");
    }
}


function viewModel() {
    var self = this;
    this.dialog = ko.observable(new TaskDialog(self));
    this.task = ko.observable(new Task('sample task'));
        
    this.editTask...