PageRenderTime 48ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/index.html

https://bitbucket.org/ilumin/backbone-example-todolist
HTML | 176 lines | 147 code | 29 blank | 0 comment | 0 complexity | 71d4c56987d000c03b9384b04a4d731c MD5 | raw file
  1. <!doctype html>
  2. <html>
  3. <head>
  4. <title>Backbone 101 - Counter button</title>
  5. <style>* { font-family: Arial; }</style>
  6. </head>
  7. <body>
  8. <h1>Backbone 101 - Todolist</h1>
  9. <h3>Step 6: Clear complete task</h3>
  10. <hr>
  11. <div id="list-holder">
  12. <button id="add-button">Add</button>
  13. <button id="clear-button">Clear</button>
  14. <button id="clear-complete-button">Clear Complete Task</button>
  15. <span id="counter">empty</span>
  16. <div id="list"></div>
  17. </div>
  18. <script type="text/template" id="todo-item-template">
  19. <input type="checkbox" <% if(checked){ %>checked<% } %>/>
  20. <% if(checked){ %>
  21. <span style="text-decoration: line-through;"><%= text %></span>
  22. <% }else{ %>
  23. <input type="text" value="<%= text %>" />
  24. <% } %>
  25. </script>
  26. <script type="text/javascript" src="assets/library/jquery/jquery.min.js"></script>
  27. <script type="text/javascript" src="assets/library/lodash/lodash.underscore.min.js"></script>
  28. <script type="text/javascript" src="assets/library/backbone/backbone.min.js"></script>
  29. <script>
  30. (function(){
  31. var TodoItem = Backbone.Model.extend({
  32. defaults: {
  33. text: "",
  34. checked: false
  35. },
  36. toggle: function(){
  37. this.set('checked', !this.get('checked'));
  38. },
  39. setText: function(value){
  40. this.set('text', value);
  41. },
  42. clear: function() {
  43. this.destroy();
  44. }
  45. });
  46. var TodoList = Backbone.Collection.extend({
  47. model: TodoItem,
  48. addNew: function(){
  49. this.add(new TodoItem());
  50. },
  51. countChecked: function(){
  52. count = 0;
  53. _.each(this.models, function(item){
  54. if(item.get('checked')) count = count + 1;
  55. });
  56. return count;
  57. }
  58. });
  59. var TodoItemView = Backbone.View.extend({
  60. template: _.template( $('#todo-item-template').html() ),
  61. events: {
  62. "click input:checkbox": "toggle",
  63. "blur input:text": "store"
  64. },
  65. toggle: function(){
  66. this.model.toggle();
  67. this.render();
  68. },
  69. store: function(){
  70. this.model.setText( this.$('input:text').val() );
  71. },
  72. render: function(){
  73. $(this.el).html(
  74. this.template(this.model.toJSON())
  75. );
  76. return this;
  77. }
  78. });
  79. var TodoListView = Backbone.View.extend({
  80. el: "#list-holder",
  81. events: {
  82. "click #add-button": "add",
  83. "click #clear-button": "clear",
  84. "click #clear-complete-button": "clearComplete"
  85. },
  86. add: function(){
  87. this.collection.addNew();
  88. },
  89. clear: function(){
  90. this.collection.reset();
  91. },
  92. clearComplete: function(){
  93. element = $('#list ul input:checkbox').filter(':checked');
  94. element.parent().remove();
  95. _.each(this.collection.models, function(item){
  96. item.clear();
  97. });
  98. return false;
  99. },
  100. render: function(){
  101. element = $('#list');
  102. element.empty();
  103. element.append('<ul>');
  104. element = $('#list ul');
  105. _.each(this.collection.models, function(item){
  106. element.append(new TodoItemView({
  107. model: item
  108. }).render().el);
  109. }, this);
  110. return this;
  111. },
  112. initialize: function(){
  113. this.render = _.bind(this.render, this);
  114. this.render();
  115. this.collection.bind('add', this.render);
  116. this.collection.bind('reset', this.render);
  117. this.collection.bind('removeChecked', this.render);
  118. }
  119. });
  120. var CounterView = Backbone.View.extend({
  121. el: '#counter',
  122. render: function(){
  123. $(this.el).text(
  124. _.size(this.collection) + ' / ' + this.collection.countChecked()
  125. );
  126. return this;
  127. },
  128. initialize: function(){
  129. this.render = _.bind(this.render, this);
  130. this.render();
  131. this.collection.bind('add', this.render);
  132. this.collection.bind('reset', this.render);
  133. this.collection.bind('change', this.render);
  134. this.collection.bind('removeChecked', this.render);
  135. }
  136. });
  137. var list = new TodoList();
  138. var listView = new TodoListView({
  139. collection: list
  140. });
  141. var listCounter = new CounterView({
  142. collection: list
  143. });
  144. })(jQuery);
  145. </script>
  146. </body>
  147. </html>