backbone-skull
Version:
Skull sits on top of Backbone and protects your application's brains.
120 lines (91 loc) • 3.4 kB
JavaScript
define(
[
'Skull',
'keyCodes',
'underscore',
'jquery'
],
function (Skull, keyCodes, _, $) {
'use strict';
var TodosView = Skull.View.extend({
tpl: 'todoList',
__registry__: function () {
var reg = this._parentResult(TodosView, '__registry__');
return _.extend({}, reg, {
collection: 'todosCollection'
});
},
events: {
'focus .edit': 'onFocus',
'blur .edit': 'onBlur',
'keypress .edit': 'updateOnEnter',
'keydown .edit': 'revertOnEscape',
'dblclick label': 'edit',
'change .toggle': 'onToggle',
'click .destroy': 'onDestroy'
},
initialize: function (options) {
TodosView.__super__.initialize.apply(this, arguments);
this.listenTo(this.collection, 'change add remove', this.render);
this.render();
},
render: function () {
this.rr({todos: this.collection.toTemplate()});
this.onRender();
},
onFocus: function (evt) {
$(evt.target).closest('li').addClass('editing');
},
onBlur: function (evt) {
var input = $(evt.target);
var label = input.closest('li');
var id = label.attr('data-id');
var value = input.val();
var trimmedValue = value.trim();
if (trimmedValue) {
var model = this.collection.get(id);
model.save({title: trimmedValue});
if (value !== trimmedValue) {
model.trigger('change');
}
} else {
this.clear(id);
}
label.removeClass('editing');
},
updateOnEnter: function (evt) {
if (evt.which === keyCodes.ENTER) {
$(evt.target).blur();
}
},
revertOnEscape: function (evt) {
if (evt.which === keyCodes.ESC) {
var target = $(evt.target);
var label = target.closest('li');
var id = label.attr('data-id');
label.removeClass('editing');
// Also reset the hidden input back to the original value.
target.val(this.collection.get(id).get('title'));
}
},
edit: function (evt) {
var li = $(evt.target).closest('li');
var input = li.find('input.edit');
li.addClass('editing');
input.focus();
},
onDestroy: function (evt) {
var id = $(evt.target).closest('li').attr('data-id');
this.clear(id);
},
onToggle: function (evt) {
var id = $(evt.target).closest('li').attr('data-id');
this.collection.get(id).toggleCompleted();
},
clear: function (id) {
this.collection.get(id).destroy();
}
});
return TodosView;
}
);