Sample Kendo
HTML
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2016.1.226/styles/kendo.common.min.css">
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2016.1.226/styles/kendo.default.min.css">
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2016.1.226/styles/kendo.material.min.css">
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2016.1.226/styles/kendo.mobile.all.min.css">
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2016.1.226/styles/kendo.mobile.material.min.css">
<script src="https://kendo.cdn.telerik.com/2016.1.226/js/jquery.min.js"></script>
<script src="https://kendo.cdn.telerik.com/2016.1.226/js/kendo.all.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout-kendo/0.9.7/knockout-kendo.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.2.0/require.min.js"></script>
<div data-role="view" id="list" data-title="Product List" data-layout="main-layout">
<ul data-role="listview" data-style="inset" data-bind="kendoListView: { data: items, template: listTemplate }"></ul>
</div>
<div data-role="view" id="detail" data-title="Product Details" data-layout="detail-layout" data-show="app.showDetails">
</div>
<div data-role="view" id="cart" data-title="Cart" data-layout="main-layout">
<div data-bind="if: items().length == 0">No items currently in cart</div>
<ul data-role="listview" data-style="inset" data-bind="kendoListView: { data: items, template: cartTemplate }"></ul>
</div>
<div data-role="layout" data-id="main-layout">
<header data-role="header">
<div data-role="navbar">
<span data-role="view-title"></span>
</div>
</header>
<div data-role="footer">
<div data-role="tabstrip">
<a id="listTab" href="#list" data-icon="list-icon">List</a>
<a id="cartTab" href="#cart" data-icon="cart">Cart</a>
</div>
</div>
</div>
<div...
CSS
* {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
body {
-webkit-touch-callout: none;
-webkit-text-size-adjust: none;
-webkit-user-select: none;
background-color: #E4E4E4;
background-image: linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
background-image: -webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
background-image: -ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
background-image: -webkit-gradient( linear, left top, left bottom, color-stop(0, #A7A7A7), color-stop(0.51, #E4E4E4));
background-attachment: fixed;
font-family: 'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif;
font-size: 12px;
height: 100%;
margin: 0px;
padding: 0px;
text-transform: uppercase;
width: 100%;
}
.km-list-icon:after,
.km-list-icon:before {
content: "\e077";
}
.km-back-icon:after,
.km-back-icon:before {
content: "\e013";
}
.product-container {
border-bottom: solid 1px #3f51b5;
}
.product-description {
display: inline-block;
vertical-align: top;
margin-top: 20px;
}
.product-description p {
margin: 5px;
}
img {
display: block;
margin: 0 auto;
max-width: 100%;
}
.product-image {
display: inline-block;
height: 100px;
width: 20%;
position: relative;
margin-right: 20px;
}
.product-image img {
max-height: 100%;
max-width: 100%;
width: auto;
height: auto;
position: absolute;
top: 0;
bottom: 0;
margin: auto;
}
.km-material .km-justified {
display: block;
width: 100% padding: .85em;
font-size: 1.07em 1.25em;
background-color: #3f51b5;
border-color: #3f51b5;
color: #fafafa
}
span.km-icon.km-big {
position: absolute;
top: 50%;
right: 30px;
margin-top: -10px;
font-size: 20px;
}
JavaScript
var kApp;
var globalKo = {};
var currentProductId = 0;
app = {
onDeviceReady: function() {
app.initList();
app.initCart();
kApp = new kendo.mobile.Application($(document.body), {
skin: 'material',
statusBarStyle: 'black-translucent',
useNativeScrolling: true
});
},
initList: function() {
$.getJSON('https://cartservices.herokuapp.com/api/product', function(data) {
ko.applyBindings(new app.models.ListViewModel(data), $('#list')[0]);
});
},
initCart: function() {
ko.applyBindings(new app.models.CartViewModel(), $('#cart')[0]);
},
showDetails: function(e) {
var view = e.view,
item;
var template = kendo.template($('#detailTemplate').html());
var item = globalKo.listItems().filter(function(element) {
return element.Id == currentProductId;
})[0];
view.content.html(template(item));
kendo.mobile.init(view.content);
$('#buyButton').click(function() {
app.addToCart(item.Id);
})
},
saveCart: function() {
localStorage.setItem('cart', ko.toJSON(globalKo.cartItems));
},
addToCart: function(productId) {
var cartItem = globalKo.cartItems().filter(function(element) {
return element.Id == productId;
});
if (cartItem && cartItem.length > 0) {
cartItem[0].quantity++;
} else {
var product = globalKo.listItems().filter(function(element) {
return element.Id == productId;
})[0];
product.quantity = 1;
globalKo.cartItems.push(product);
}
app.saveCart();
globalKo.cartItems.valueHasMutated();
},
models: {
CartViewModel: function() {
var self = this;
globalKo.cartItems = self.items = ko.observableArray(JSON.parse(localStorage.getItem('cart')) || []);
self.cartTemplate = kendo.template($('#cartListTemplate').html());
self.removeItem = function(vm, event) {
var element = $(event.target).parents('div.cart-item-container');
productId =...