Kendo/MVVM/DataSource

HTML

<script src="http://cdn.kendostatic.com/2012.3.1315/js/kendo.all.min.js"></script>
<script src="http://include.jaydata.org/datajs-1.0.3.js"></script>
<script src="http://include.jaydata.org/jaydata.js"></script>
<script src="http://include.jaydata.org/jaydatamodules/kendo.js"></script>
<link rel="stylesheet" href="http://cdn.kendostatic.com/2012.3.1315/styles/kendo.common.min.css">
<link rel="stylesheet" href="http://cdn.kendostatic.com/2012.3.1315/styles/kendo.default.min.css">
<div id="container">
    <div class="k-toolbar k-grid-toolbar">
        <a class="k-button k-button-icontext k-add-button" data-bind="click: addNew" href="\\#"><span class="k-icon k-add"></span>Add new record</a>
    </div>
    <div data-role="listview" id="listView" data-bind="source: taskSource" data-template="template" data-edit-template="editTemplate">
    </div>
</div>

<script type="text/x-kendo-tmpl" id="template">
        <div class="product-view">
            <dl>
                <dt>Id</dt>
                <dd>${Id}</dd>
                <dt>Todo</dt>
                <dd>${Todo}</dd>
                <dt>Completed</dt>
                <dd>${Completed}</dd>
            </dl>
            <div class="edit-buttons">
                <a class="k-button k-button-icontext k-edit-button" href="\\#"><span class="k-icon k-edit"></span>Edit</a>
                <a class="k-button k-button-icontext k-delete-button" href="\\#"><span class="k-icon k-delete"></span>Delete</a>
            </div>
        </div>
</script>

 <script type="text/x-kendo-tmpl" id="editTemplate">
        <div class="product-view">
            <dl>
                <dt>Id</dt>
                <dd>${Id}</dd>
                <dt>Todo</dt>
                <dd>
                    <input type="text" data-bind="value:Todo" name="Todo" required="required" validationMessage="required" />
                    <span data-for="Todo" class="k-invalid-msg"></span>
                </dd>
                <dt>Completed</dt>
               ...

CSS

.product-view {
    float: left;
    width: 320px;
    margin: 5px;
    padding: 3px;
    -moz-box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.1);
    -webkit-box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.1);
    box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.1);
    border-top: 1px solid rgba(0, 0, 0, 0.1);
    -webkit-border-radius: 8px;
    -moz-border-radius: 8px;
    border-radius: 8px;
}
.product-view dl {
    margin: 10px 0;
    padding: 0;
    min-width: 0;
}
.product-view dt, dd {
    float: left;
    margin: 0;
    padding: 0;
    height: 30px;
    line-height: 30px;
}
.product-view dt {
    clear: left;
    padding: 0 5px 0 15px;
    text-align: right;
    opacity: 0.6;
    width: 100px;
}
.k-listview {
    border: 0;
    padding: 0;
    min-width: 0;
}
.k-listview:after, .product-view dl:after {
    content:".";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
}
.edit-buttons {
    text-align: right;
    padding: 5px;
    min-width: 100px;
    border-top: 1px solid rgba(0, 0, 0, 0.1);
    -webkit-border-radius: 8px;
    -moz-border-radius: 8px;
    border-radius: 8px;
}
.k-toolbar, #listView, .k-pager-wrap {
    width: 660px;
    margin: 0 auto;
    -webkit-border-radius: 11px;
    -moz-border-radius: 11px;
    border-radius: 11px;
}
#listView {
    width: 674px;
}
span.k-invalid-msg {
    position: absolute;
    margin-left: 6px;
}

JavaScript

$(function () {
    var Task = $data.define("Task", {
        Todo: {
            type: String,
            required: true
        },
        Completed: Boolean
    });

    var viewModel = kendo.observable({
        taskSource: Task.asKendoDataSource({pageSize: 4}),
        addNew: function () {
            $('#listView').getKendoListView().add();  
            //viewModel.taskSource.add();
        },
    });
    kendo.bind($("#container"), viewModel);

    //add some data if db is empty
    Task.readAll()
        .then(function (items) {
            if (items.length == 0) {
                return Task.addMany([{ Todo: 'Include script files', Completed: true }, 
                                     { Todo: 'Define model', Completed: true }, 
                                     { Todo: 'Connect data to grid' }]);
            }
        }).then(function() {
            viewModel.taskSource.fetch();
        });


});