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();
});
});