/labs/architecture-examples/backbone.xmpp/js/views/todos.js
JavaScript | 88 lines | 55 code | 18 blank | 15 comment | 5 complexity | 96c67efbc18f2a9032ea736fb5315388 MD5 | raw file
- var app = app || {};
- $(function() {
- 'use strict';
- // Todo Item View
- // --------------
- // The DOM element for a todo item...
- app.TodoView = Backbone.View.extend({
- //... is a list tag.
- tagName: 'li',
- // Cache the template function for a single item.
- template: _.template( $('#item-template').html() ),
- // The DOM events specific to an item.
- events: {
- 'click .toggle': 'togglecompleted',
- 'dblclick label': 'edit',
- 'click .destroy': 'clear',
- 'keypress .edit': 'updateOnEnter',
- 'blur .edit': 'close'
- },
- // The TodoView listens for changes to its model, re-rendering. Since there's
- // a one-to-one correspondence between a **Todo** and a **TodoView** in this
- // app, we set a direct reference on the model for convenience.
- initialize: function() {
- this.model.on( 'change', this.render, this );
- this.model.on( 'destroy', this.remove, this );
- this.model.collection.on( 'remove', this.remoteRemove, this);
- },
- remoteRemove: function (model) {
- if (model.id === this.model.id) {
- this.remove();
- }
- },
- // Re-render the titles of the todo item.
- render: function() {
- this.$el.html( this.template( this.model.toJSON() ) );
- this.$el.toggleClass( 'completed', this.model.get('completed') );
- this.input = this.$('.edit');
- return this;
- },
- // Toggle the `"completed"` state of the model.
- togglecompleted: function() {
- this.model.toggle();
- },
- // Switch this view into `"editing"` mode, displaying the input field.
- edit: function() {
- this.$el.addClass('editing');
- this.input.focus();
- },
- // Close the `"editing"` mode, saving changes to the todo.
- close: function() {
- var value = this.input.val().trim();
- if ( value ) {
- this.model.save({ title: value });
- } else {
- this.clear();
- }
- this.$el.removeClass('editing');
- },
- // If you hit `enter`, we're through editing the item.
- updateOnEnter: function( e ) {
- if ( e.which === ENTER_KEY ) {
- this.close();
- }
- },
- // Remove the item, destroy the model from *localStorage* and delete its view.
- clear: function() {
- this.model.destroy();
- }
- });
- });