Uncaught TypeError: undefined не является функцией rails3 / backbone / js - PullRequest
10 голосов
/ 27 апреля 2011

Я только начал углубляться в javascript, чтобы сделать проект более отзывчивым, и я работаю на примере backbone.js.

Я повторил http://www.jamesyu.org/2011/01/27/cloudedit-a-backbone-js-tutorial-by-example/ в новом проекте Rails 3.

Я запускаю проект и захожу на домашнюю страницу .... и там есть ссылка на / # и больше ничего. Заглядывая в консоль js, я получаю ошибки в двух скриптах: application.js и backbone.js

This (backbone.js)

backbone-min-0-3-3.js:8Uncaught TypeError: Cannot call method 'extend' of undefined

и это (application.js):

var App = {
        Views: {},
        Controllers: {},
        Collections: {},
        init: function() {

        new App.Controllers.Fffforms();
**error message ---> application.js:9Uncaught TypeError: undefined is not a function**
            Backbone.history.start();
        }
};

Будучи новичком в js, это не имеет особого смысла, и ничто из того, что я искал, не помогло в краткосрочной перспективе.

Может кто-нибудь сказать мне, что именно указывают на эти ошибки и как я могу предпринять дальнейшие действия? Все проверяет, сравнивая ресурсы в https://github.com/jamesyu/CloudEdit, но моя репликация из нового проекта rails 3 (не клон этого репо) не работает точно.

Любые предложения приветствуются, учитывая, что я только начал изучать некоторый JavaScript.

EDIT:

По предложению я пошел и фактически добавил в гем Jammit и сконфигурировал его так, чтобы он обслуживал все сценарии js, чего не было у Rails по умолчанию. Теперь все скрипты отправляются в браузер (включая контроллер). К сожалению, это не решает исходную проблему, а только дает больше ошибок при загрузке, вытекающих из инициализации приложения, которая находится в консоли chrome js:

Uncaught TypeError: undefined is not a function
App.initapplication.js:9
(anonymous function):3000/#new:32
d.extend._Deferred.f.resolveWithjquery.min.js:16
d.d.extend.readyjquery.min.js:16
d.c.addEventListener.yjquery.min.js:16

Учитывая, что я только что копирую прямо сейчас, у меня должна быть какая-то маленькая упущенная деталь, которая мешает запуску приложения должным образом.

Ответы [ 5 ]

7 голосов
/ 27 апреля 2011

Похоже, вы не включаете файл, который содержит объявление App.Controllers.Fffforms.Убедитесь, что вы включаете этот файл где-то в коде до того, как вы включаете application.js.

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

Мой ответ похож на @ ream88, но функция Rails 3.1+ Asset Pipeline заботится о минимизации, связывании и т. Д., Поэтому я предпочитаю, чтобы неминифицированные версии были доступны для отладки и т. Д.

Загрузите закомментированную / полную версию backbone.js и underscore.js и сохраните их в app/assets/javascripts (вы также можете сохранить их в vendor/assets/javascripts).

Разница в том, что вам нужно обновить файл манифеста (app/assets/javascripts/application.js), чтобы добавить директивы require, например

//= require jquery
//= require jquery_ujs
//= require underscore
//= require backbone
//= require_tree .

Поскольку основа зависит от подчеркивания, это приведет к их загрузке в правильном порядке, что позволит избежать ошибки.

2 голосов
/ 25 августа 2011

Полагаю, в вашем приложении есть своего рода механизм связывания. Убедитесь, что все файлы правильно используют точки с запятой (;) во всех связанных файлах.

1 голос
/ 14 апреля 2012

Это просто укусило меня, поэтому я решил поделиться своей находкой: убедитесь, что окончания строк вашего файла соответствуют файловой системе вашего сервера.

1 голос
/ 05 октября 2011

столкнулся с той же проблемой, и затем я понял, что я нигде не включил underscore.js. Поэтому я написал простой backbone.js файл:

/*
 *= require backbone/underscore-min.js
 *= require backbone/backbone-min.js
 */

и сохранил его под vendor/assets/javascripts вместе с файлами Backbone и Underscore:

vendor/assets/javascripts/
├── backbone
│   ├── backbone-min.js
│   └── underscore-min.js
└── backbone.js

Мой application.js.coffee теперь выглядит примерно так:

#= require backbone
#= require query
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...