From 4109040004ec29228916938a82afd9a250949a03 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Tue, 26 Oct 2010 09:33:21 -0400 Subject: [PATCH] Adding the Todos example to the homepage --- docs/images/todos.png | Bin 0 -> 41820 bytes docs/todos.html | 62 +++++++++++++-------------- examples/todos/todos.js | 13 +++--- index.html | 93 ++++++++-------------------------------- 4 files changed, 57 insertions(+), 111 deletions(-) create mode 100644 docs/images/todos.png diff --git a/docs/images/todos.png b/docs/images/todos.png new file mode 100644 index 0000000000000000000000000000000000000000..e1003a5d4a1aff3855a3d187eab220373767a8de GIT binary patch literal 41820 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 literal 0 HcmV?d00001 diff --git a/docs/todos.html b/docs/todos.html index 892d1b4df..ba0eb7036 100644 --- a/docs/todos.html +++ b/docs/todos.html @@ -1,68 +1,68 @@ - todos.js

todos.js

Example Backbone App contributed by Jérôme Gravel-Niquet.

Load the application once the DOM is ready, using jQuery.ready:

$(function(){

Todo Model

Our basic Todo model has content, order, and done attributes.

  window.Todo = Backbone.Model.extend({
-
-    EMPTY: "empty todo...",

Ensure that each todo is created with the content field filled in, if -nothing has been specified.

    initialize: function() {
+      todos.js           

todos.js

An example Backbone application contributed by +Jérôme Gravel-Niquet. This demo uses a simple +LocalStorage adapter +to persist Backbone models within your browser.

Load the application once the DOM is ready, using jQuery.ready:

$(function(){

Todo Model

Our basic Todo model has content, order, and done attributes.

  window.Todo = Backbone.Model.extend({

If you don't provide a todo, one will be provided for you.

    EMPTY: "empty todo...",

Ensure that each todo created has content.

    initialize: function() {
       if (!this.get("content")) {
         this.set({"content": this.EMPTY});
       }
-    },

Toggle the done state of this todo item.

    toggle: function() {
+    },

Toggle the done state of this todo item.

    toggle: function() {
       this.save({done: !this.get("done")});
-    },

Remove this Todo from localStorage, deleting its view.

    clear: function() {
+    },

Remove this Todo from localStorage, deleting its view.

    clear: function() {
       this.destroy();
       $(this.view.el).remove();
     }
 
-  });

Todo Collection

The collection of todos is backed by localStorage instead of a remote -server.

  window.TodoList = Backbone.Collection.extend({

Reference to this collection's model.

    model: Todo,

Save all of the todo items under the "todos" namespace.

    localStore: "todos",

Filter down the list of all todo items that are finished.

    done: function() {
+  });

Todo Collection

The collection of todos is backed by localStorage instead of a remote +server.

  window.TodoList = Backbone.Collection.extend({

Reference to this collection's model.

    model: Todo,

Save all of the todo items under the "todos" namespace.

    localStore: "todos",

Filter down the list of all todo items that are finished.

    done: function() {
       return this.filter(function(todo){ return todo.get('done'); });
-    },

Filter down the list to only todo items that are still not finished.

    remaining: function() {
+    },

Filter down the list to only todo items that are still not finished.

    remaining: function() {
       return this.without.apply(this, this.done());
-    },

We keep the Todos in sequential order, despite being saved by unordered + },

We keep the Todos in sequential order, despite being saved by unordered GUID in the database. This generates the next order number for new items.

    nextOrder: function() {
       if (!this.length) return 1;
       return this.last().get('order') + 1;
-    },

Todos are sorted by their original insertion order.

    comparator: function(todo) {
+    },

Todos are sorted by their original insertion order.

    comparator: function(todo) {
       return todo.get('order');
     }
 
-  });

Create our global collection of Todos.

  window.Todos = new TodoList;

Todo Item View

The DOM element for a todo item...

  window.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: {
+  });

Create our global collection of Todos.

  window.Todos = new TodoList;

Todo Item View

The DOM element for a todo item...

  window.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 .check"              : "toggleDone",
       "dblclick div.todo-content" : "edit",
       "click span.todo-destroy"   : "clear",
       "keypress .todo-input"      : "updateOnEnter"
-    },

The TodoView listens for changes to its model, re-rendering. Since there's + },

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() {
       _.bindAll(this, 'render');
       this.model.bind('change', this.render);
       this.model.view = this;
-    },

Re-render the contents of the todo item.

    render: function() {
+    },

Re-render the contents of the todo item.

    render: function() {
       $(this.el).html(this.template(this.model.toJSON()));
       this.setContent();
       return this;
-    },

To avoid XSS (not that it would be harmful in this particular app), + },

To avoid XSS (not that it would be harmful in this particular app), we use jQuery.text to set the contents of the todo item.

    setContent: function() {
       var content = this.model.get('content');
       this.$('.todo-content').text(content);
       this.$('.todo-input').val(content);
-    },

Toggle the "done" state of the model.

    toggleDone: function() {
+    },

Toggle the "done" state of the model.

    toggleDone: function() {
       this.model.toggle();
-    },

Switch this view into "editing" mode, displaying the input field.

    edit: function() {
+    },

Switch this view into "editing" mode, displaying the input field.

    edit: function() {
       $(this.el).addClass("editing");
-    },

If you hit enter, submit the changes to the todo item's content.

    updateOnEnter: function(e) {
+    },

If you hit enter, submit the changes to the todo item's content.

    updateOnEnter: function(e) {
       if (e.keyCode != 13) return;
       this.model.save({content: this.$(".todo-input").val()});
       $(this.el).removeClass("editing");
-    },

Remove the item, destroy the model.

    clear: function() {
+    },

Remove the item, destroy the model.

    clear: function() {
       this.model.clear();
     }
 
-  });

The Application

Our overall AppView is the top-level piece of UI.

  window.AppView = Backbone.View.extend({

Instead of generating a new element, bind to the existing skeleton of -the App already present in the HTML.

    el: $("#todoapp"),

Our template for the line of statistics at the bottom of the app.

    template: _.template($('#stats-template').html()),

Delegated events for creating new items, and clearing completed ones.

    events: {
+  });

The Application

Our overall AppView is the top-level piece of UI.

  window.AppView = Backbone.View.extend({

Instead of generating a new element, bind to the existing skeleton of +the App already present in the HTML.

    el: $("#todoapp"),

Our template for the line of statistics at the bottom of the app.

    statsTemplate: _.template($('#stats-template').html()),

Delegated events for creating new items, and clearing completed ones.

    events: {
       "keypress #new-todo":  "createOnEnter",
       "keyup #new-todo":     "showTooltip",
       "click .todo-clear a": "clearCompleted"
-    },

At initialization we bind to the relevant events on the Todos + },

At initialization we bind to the relevant events on the Todos collection, when items are added or changed. Kick things off by loading any preexisting todos that might be saved in localStorage.

    initialize: function() {
       _.bindAll(this, 'addOne', 'addAll', 'render');
@@ -74,35 +74,35 @@
       Todos.bind('all',     this.render);
 
       Todos.fetch();
-    },

Re-rendering the App just means refreshing the statistics -- the rest + },

Re-rendering the App just means refreshing the statistics -- the rest of the app doesn't change.

    render: function() {
       var done = Todos.done().length;
-      this.$('#todo-stats').html(this.template({
+      this.$('#todo-stats').html(this.statsTemplate({
         total:      Todos.length,
         done:       Todos.done().length,
         remaining:  Todos.remaining().length
       }));
-    },

Add a single todo item to the list by creating a view for it, and + },

Add a single todo item to the list by creating a view for it, and appending its element to the <ul>.

    addOne: function(todo) {
       var view = new TodoView({model: todo});
       this.$("#todo-list").append(view.render().el);
-    },

Add all items in the Todos collection at once.

    addAll: function() {
+    },

Add all items in the Todos collection at once.

    addAll: function() {
       Todos.each(this.addOne);
-    },

Generate the attributes for a new Todo item.

    newAttributes: function() {
+    },

Generate the attributes for a new Todo item.

    newAttributes: function() {
       return {
         content: this.input.val(),
         order:   Todos.nextOrder(),
         done:    false
       };
-    },

If you hit return in the main input field, create new Todo model, + },

If you hit return in the main input field, create new Todo model, persisting it to localStorage.

    createOnEnter: function(e) {
       if (e.keyCode != 13) return;
       Todos.create(this.newAttributes());
       this.input.val('');
-    },

Clear all done todo items, destroying their models.

    clearCompleted: function() {
+    },

Clear all done todo items, destroying their models.

    clearCompleted: function() {
       _.each(Todos.done(), function(todo){ todo.clear(); });
       return false;
-    },

Lazily show the tooltip that tells you to press enter to save + },

Lazily show the tooltip that tells you to press enter to save a new todo item, after one second.

    showTooltip: function(e) {
       var tooltip = this.$(".ui-tooltip-top");
       var val = this.input.val();
@@ -113,7 +113,7 @@
       this.tooltipTimeout = _.delay(show, 1000);
     }
 
-  });

Finally, we kick things off by creating the App.

  window.App = new AppView;
+  });

Finally, we kick things off by creating the App.

  window.App = new AppView;
 
 });
 
diff --git a/examples/todos/todos.js b/examples/todos/todos.js
index 18aff7c1a..a8650f976 100644
--- a/examples/todos/todos.js
+++ b/examples/todos/todos.js
@@ -1,4 +1,7 @@
-// Example Backbone App contributed by [Jérôme Gravel-Niquet](http://jgn.me/).
+// An example Backbone application contributed by
+// [Jérôme Gravel-Niquet](http://jgn.me/). This demo uses a simple
+// [LocalStorage adapter](http://github.com/jeromegn/Backbone.localStorage)
+// to persist Backbone models within your browser.
 
 // Load the application once the DOM is ready, using `jQuery.ready`:
 $(function(){
@@ -9,10 +12,10 @@ $(function(){
   // Our basic **Todo** model has `content`, `order`, and `done` attributes.
   window.Todo = Backbone.Model.extend({
 
+    // If you don't provide a todo, one will be provided for you.
     EMPTY: "empty todo...",
 
-    // Ensure that each todo is created with the `content` field filled in, if
-    // nothing has been specified.
+    // Ensure that each todo created has `content`.
     initialize: function() {
       if (!this.get("content")) {
         this.set({"content": this.EMPTY});
@@ -151,7 +154,7 @@ $(function(){
     el: $("#todoapp"),
 
     // Our template for the line of statistics at the bottom of the app.
-    template: _.template($('#stats-template').html()),
+    statsTemplate: _.template($('#stats-template').html()),
 
     // Delegated events for creating new items, and clearing completed ones.
     events: {
@@ -179,7 +182,7 @@ $(function(){
     // of the app doesn't change.
     render: function() {
       var done = Todos.done().length;
-      this.$('#todo-stats').html(this.template({
+      this.$('#todo-stats').html(this.statsTemplate({
         total:      Todos.length,
         done:       Todos.done().length,
         remaining:  Todos.remaining().length
diff --git a/index.html b/index.html
index 783a45424..1b945038b 100644
--- a/index.html
+++ b/index.html
@@ -1514,81 +1514,24 @@ 

Backbone.View

Examples

- As a quick example to help get an idea of how Backbone can be used in a - real-world project, here are the method signatures (beyond the built-in - methods that Backbone provides) of the Document - model, and the DocumentSet collection, as used in - DocumentCloud. In the workspace, - these classes work together with many others: Project, Note, - Account, Entity, Organization... -

- -
-dc.model.Document = Backbone.Model.extend({
-
-  initialize(attributes): ...
-
-  canonicalId: ...
-
-  url: ...
-  viewerUrl: ...
-  publishedUrl: ...
-  pageThumbnailURL(page): ...
-
-  openViewer: ...
-  openPublishedViewer: ...
-  openText: ...
-  openPDF: ...
-
-  allowedToEdit: ...
-  checkAllowedToEdit(errorMessage): ...
-  checkBusy: ...
-
-  uniquePageEntities: ...
-
-  isPending: ...
-  isPublic: ...
-  isPublished: ...
-
-  toString: ...
-
-});
-
-
-dc.model.DocumentSet = Backbone.Collection.extend({
-
-  model: dc.model.Document,
-
-  url: '/documents',
-
-  initialize(options): ...
-
-  comparator(document): ...
-
-  selectAll: ...
-  deselectAll: ...
-  selectedIds: ...
-
-  filterPending: ...
-  filterSelected: ...
-
-  getCommonAttribute(documents, attribute): ...
-
-  allowedToEdit(documents, errorMessage): ...
-  editAccess(documents): ...
-
-  downloadSelectedViewers: ...
-  downloadSelectedPDFs: ...
-  downloadSelectedTexts: ...
-
-  poll: ...
-  startPolling: ...
-  stopPolling: ...
-
-  verifyDestroy(documents): ...
-
-});
-
+ Jérôme Gravel-Niquet has contributed a + Todo List application + that is bundled in the repository as Backbone example. If you're wondering + where to get started with Backbone in general, take a moment to + read through the annotated source. The app uses a + LocalStorage adapter + to transparently save all of your todos within your browser, instead of + sending them to a server. Jérôme also has a version hosted at + localtodos.com that uses a + MooTools-backed version of Backbone + instead of jQuery. +

+ +
+ + Todos + +

Change Log