Uncaught TypeError: Невозможно вызвать метод 'extension' из неопределенного - PullRequest
4 голосов
/ 06 января 2012

Я пытаюсь получить класс CoffeeScript для расширения Backbone.Model. Я построил новое приложение rails 3.1, создал скаффолд «Камень» с 3 атрибутами и вставил фрагмент примера Todos.coffee в файл stone.js.coffee. У меня есть и backbone.js, и underscore.js в папке app / assets / javascripts. Когда я запускаю это в консоли Chrome Java, я получаю сообщение выше в журнале консоли. Есть идеи?

Фактический код следующий:

$ -> 

  class Todo extends Backbone.Model
    # Default attributes for the todo.
    defaults:
     content: "empty todo..."
     done: false

    # Ensure that each todo created has `content`.
    initialize: ->
      if !@get("content")
      @set({ "content": @defaults.content })

    # Toggle the `done` state of this todo item.
    toggle: ->
      @save({ done: !@get("done") })

    # Remove this Todo from *localStorage* and delete its view.
    clear: ->
      @destroy()
      @view.remove()

Используемый application.js - это то, что было сгенерировано Rails 3.1. Я скопировал backbone.js и underscore.js из репозитория Todos github, https://github.com/JasonGiedymin/backbone-todojs-coffeescript

1 Ответ

16 голосов
/ 07 января 2012

Проблема в том, что underscore.js загружается после backbone.js, когда это предварительное требование, которое должно быть загружено ранее.(Обратите внимание, что в источнике Backbone.js он устанавливает var _ = root._ немедленно, поэтому, даже если глобальный _ объявлен позже, он не виден из области действия Backbone.) Sprockets загружает файлы JS в ваши активыкаталог в алфавитном порядке по умолчанию.

Вы можете исправить это, используя Sprockets: поставьте

//= require underscore.js

перед

//= require_tree .

, чтобы убедиться, что он загружается первым.

...