Advertisement
Guest User

Untitled

a guest
Jun 5th, 2012
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class Todo extends Backbone.Model
  2.     defaults:
  3.         title: ''
  4.         priority: 0
  5.         done: false
  6.  
  7.     validate: (attrs) ->
  8.         errs = {}
  9.         hasErrors = false
  10.  
  11.         if (attrs.title is "")
  12.             hasErrors = true
  13.             errs.title = "Please specify a todo"
  14.  
  15.         if hasErrors
  16.             console.log "Model is invalid!"
  17.             return errs
  18.  
  19. class Todos extends Backbone.Collection
  20.     model: Todo
  21.     localStorage: new Backbone.LocalStorage("Todos")
  22.  
  23.  
  24. class TodoView extends Backbone.View
  25.     tagName: 'li'
  26.  
  27.     events:
  28.         "change input[type=checkbox]": "toggleDone"
  29.         "click .edit": "startEdit"
  30.         "dblclick": "startEdit"
  31.         "click .del": "delete"
  32.         "click .editing .save": "saveTodo"
  33.         "keypress .editing input[name=todo]": "saveTodo"
  34.         "keyup .editing input[name=todo]": "closeEdit"
  35.         "click .editing .cancel": "closeEdit"
  36.         "blur input[name=todo]": "clearErrors"
  37.  
  38.     initialize: ->
  39.         _.bindAll(@, "render",
  40.                      "toggleDone",
  41.                      "startEdit",
  42.                      "delete",
  43.                      "saveTodo",
  44.                      "closeEdit"
  45.                      "handleError",
  46.                      "clearErrors")
  47.         @model.bind("change", @render)
  48.         @model.bind("error", @handleError)
  49.         @template = _.template($("#tmplTodoView").html())
  50.  
  51.     render: ->
  52.         @$el.html(@template(this.model.toJSON()))
  53.         if @model.get("done")
  54.             @$el.addClass("done")
  55.             @$("input[type=checkbox]").prop("checked", true)
  56.         else
  57.             @$el.removeClass("done")
  58.         return this
  59.  
  60.     toggleDone: ->
  61.         if @$el.hasClass("editing") then return false
  62.         if @model.get("done") is true
  63.             @model.set("done", false)
  64.         else
  65.             @model.set("done", true)
  66.         @model.save()
  67.  
  68.     startEdit: ->
  69.         if @$el.hasClass("editing") then return
  70.         @$el.addClass("editing")
  71.         @$(".editView input[name=todo]").val(@model.get("title"))
  72.  
  73.     delete: ->
  74.         @model.destroy()
  75.         @$el.remove()
  76.  
  77.     saveTodo: (e) ->
  78.         if e.type is "keypress" and e.charCode isnt 13
  79.             return
  80.         @model.set("title", @$("input[name=todo]").val())
  81.         if @model.isValid()
  82.             @model.save()
  83.             @closeEdit()
  84.  
  85.     closeEdit: (e) ->
  86.         if (e)
  87.             if e.type is "keyup" and e.keyCode isnt 27 then return
  88.         @$el.removeClass("editing")
  89.  
  90.     handleError: (model, errs) ->
  91.         @clearErrors()
  92.         @$el.find("input[name=todo]").after($("<span />", {
  93.             class: "error",
  94.             html: errs.title
  95.         }))
  96.  
  97.     clearErrors: ->
  98.         @$el.remove(".error")
  99.  
  100. class TodosAppView extends Backbone.View
  101.     tagName: "section"
  102.     id: "todosApp"
  103.  
  104.     events:
  105.         "keypress #frmTodo input[name=todo]": "addTodo"
  106.         "change #frmTodo input[name=todo]": "clearErrors"
  107.         "blur #frmTodo input[name=todo]": "clearErrors"
  108.  
  109.     initialize: ->
  110.         _.bindAll(@, "render",
  111.                      "addTodo",
  112.                      "handleAddTodoError",
  113.                      "clearErrors")
  114.         @collection.bind("add", @render)
  115.         @template = _.template($("#tmplTodosAppView").html())
  116.  
  117.     render: ->
  118.         @$el.html(@template({}))
  119.         for todo in @collection.models
  120.             view = new TodoView({ model: todo })
  121.             @$el.find("ul.todos").append(view.render().el)
  122.         return @
  123.  
  124.     addTodo: (e) ->
  125.         if e.charCode isnt 13 then return
  126.         e.preventDefault()
  127.         todo = new Todo()
  128.         todo.bind("error", @handleAddTodoError)
  129.         todo.set({ title: @$("#frmTodo input[name=todo]").val() })
  130.         if todo.isValid()
  131.             @collection.add(todo)
  132.             todo.save()
  133.             todo.unbind("error")
  134.  
  135.     handleAddTodoError: (model, errs) ->
  136.         @clearErrors()
  137.         @$("#frmTodo").append($("<span />", {
  138.             class: "error",
  139.             html: errs.title
  140.         }))
  141.  
  142.     clearErrors: ->
  143.         @$("#frmTodo .error").remove()
  144.  
  145. jQuery ->
  146.     todos = new Todos()
  147.     todos.fetch()
  148.     appview = new TodosAppView({ collection: todos })
  149.     $("#main").append(appview.render().el);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement