Knockout.js Todo Example
by Rupesh Kokal
HTML
<script src="http://knockoutjs.com/downloads/knockout-2.3.0.js"></script>
<div>
<div data-bind="event: { mouseover: enableDetails, mouseout: disableDetails }">
Mouse over me
</div>
<div data-bind="visible: detailsEnabled">
Details
</div>
<br>
<input type="text"/><br>
<label tabIndex="2" data-bind="tabKeyUp: keyCode">Tap on me and press key to know key code</label>
<br>
<label>Key Code: </label>
<label data-bind="text:keyCode"></label>
<br>
<input type="text"/>
</div>
CSS
body {
font-size: 14px;
background: #eeeeee;
color: #333333;
width: 520px;
margin: 0 auto;
}
#todoapp {
background: #fff;
padding: 20px;
margin-bottom: 40px;
}
#todoapp h1 {
font-size: 36px;
text-align: center;
}
#todoapp input[type="text"] {
width: 466px;
font-size: 24px;
line-height: 1.4em;
padding: 6px;
}
#main {
display: none;
}
#todo-list {
margin: 10px 0;
padding: 0;
list-style: none;
}
#todo-list li {
padding: 18px 20px 18px 0;
position: relative;
font-size: 24px;
border-bottom: 1px solid #cccccc;
}
#todo-list li:last-child {
border-bottom: none;
}
#todo-list li .edit {
display: none;
}
#todo-list li.editing {
border-bottom: 1px solid #778899;
}
#todo-list li.editing .view {
display: none;
}
#todo-list li.editing .edit {
display: block;
width: 444px;
padding: 13px 15px 14px 20px;
margin: 0;
}
#todo-list li.done label {
color: #777777;
text-decoration: line-through;
}
#todo-list .destroy {
position: absolute;
right: 5px;
top: 20px;
display: none;
cursor: pointer;
width: 20px;
height: 20px;
}
#todoapp footer {
display: none;
margin: 0 -20px -20px -20px;
overflow: hidden;
color: #555555;
background: #f4fce8;
border-top: 1px solid #ededed;
padding: 0 20px;
line-height: 37px;
}
.todo-count {
float:left;
}
.todo-count .count{
font-weight:bold;
}
#clear-completed {
float: right;
line-height: 20px;
text-decoration: none;
background: rgba(0, 0, 0, 0.1);
color: #555555;
font-size: 11px;
margin-top: 8px;
margin-bottom: 8px;
padding: 0 10px 1px;
cursor: pointer;
}
JavaScript
ko.bindingHandlers.tabKeyUp = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
debugger;
var allBindings = allBindingsAccessor();
$(element).on('keyup', function (e) {
debugger;
var keyCode = e.which || e.keyCode;
if (keyCode !== 13) {
return true;
}
valueAccessor()(keyCode);
var target = e.target;
target.blur();
return false;
});
}
};
var viewModel = {
detailsEnabled: ko.observable(false),
keyCode: ko.observable("0"),
enableDetails: function() {
this.detailsEnabled(true);
},
disableDetails: function() {
this.detailsEnabled(false);
},
displayCode: function(data, event) {
debugger;
this.keyCode(event.keyCode);
}
};
ko.applyBindings(viewModel);