Что не так в этом коде backbone.js с ошибкой «a._validate не является функцией»? - PullRequest
0 голосов
/ 26 февраля 2012

Я пытаюсь разработать приложение для списка Todo, например пример приложения для Backbone.js.Код здесь (ветвь прототипа самая последняя).Когда вводится текст, задача с текстом должна быть сохранена в локальном хранилище.Но текст не удалось сохранить с приведенной ниже ошибкой.

a._validate не является функцией

Почему?Коды следующие.

app / assets / javascripts / tasks.js.coffee

$ ->
  tasks = new Todoapp.Collections.Tasks
  appView = new Todoapp.Views.AppView(el: $("#todoapp"), collection: tasks)

app / assets / javascripts / backbone / views / app.js.coffee

Todoapp.Views.AppView = Backbone.View.extend
  events:
    "keypress #task_input" : "createTask"
  initialize: ->
    this.collection.bind("add", this.alertCreate, this)
  createTask: (e) ->
    text = $("#task_input").val()
    return if !text or e.keyCode isnt 13
    this.collection.create(content: text)
    $("#task_input").val("")
  alertCreate: ->
    alert("Created!")

app / assets / javascripts / backbone / collection / tasks.js.coffee

Todoapp.Collections.Tasks = Backbone.Collection.extend
  model: Todoapp.Models.Task
  localStorage: new Store("tasks")

app / assets / javascripts / backbone / models / task.js.coffee

Todoapp.Models.Task = Backbone.Model.extend

1 Ответ

2 голосов
/ 26 февраля 2012

Ваша проблема с определением модели:

Todoapp.Models.Task = Backbone.Model.extend

Все, что делает, это назначает метод Backbone.Model.extend для Todoapp.Models.Task, он не выполняет метод extend. Добавьте несколько скобок, и это будет работать:

Todoapp.Models.Task = Backbone.Model.extend()

Демо: http://jsfiddle.net/ambiguous/ejjHz/

Или, лучше, напишите ваш CoffeeScript на CoffeeScript, а не какую-то смесь CoffeeScript и JavaScript:

class Todoapp.Models.Task extends Backbone.Model

class Todoapp.Collections.Tasks extends Backbone.Collection
  model: Task
  localStorage: new Store('tasks')

class Todoapp.Views.AppView extends Backbone.View
  events:
    'keypress #task_input' : 'createTask'
  initialize: ->
    @collection.bind('add', @alertCreate)
  createTask: (e) ->
    text = $('#task_input').val()
    return if !text or e.keyCode isnt 13
    @collection.create(content: text)
    $('#task_input').val('')
  alertCreate: =>
    alert('Created!')

Демо: http://jsfiddle.net/ambiguous/HPHVG/

Изменения:

  1. Используйте class ... extends вместо C = B.extend. Одно это решит вашу проблему.
  2. Используйте @ вместо this.
  3. Используйте связанные методы (=>) вместо предоставления контекста для bind.
...