#javascript #ruby-on-rails #ajax #ruby-on-rails-3 #backbone.js
#javascript #ruby-on-rails #ajax #ruby-on-rails-3 #backbone.js
Вопрос:
Я только начал углубляться в javascript, чтобы сделать проект более отзывчивым, и я работаю через backbone.js пример.
Я скопировал http://www.jamesyu.org/2011/01/27/cloudedit-a-backbone-js-tutorial-by-example в новом проекте Rails 3.
Я запускаю проект и захожу на домашнюю страницу …. и там есть ссылка на /# и больше ничего. Заглядывая в консоль js, я получаю ошибки в двух скриптах: application.js и backbone.js
Это (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.
Редактировать:
По предложению я пошел и фактически добавил в Jammit gem и настроил его для обслуживания всех js-скриптов, которых в Rails all по умолчанию не было. Теперь все скрипты отправляются в браузер (включая контроллер). К сожалению, это не решает исходную проблему, а только выдает больше ошибок при загрузке, вытекающих из инициализации приложения, которая является this в консоли 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
Учитывая, что я просто копирую прямо сейчас, должна быть какая-то небольшая упущенная деталь за пределами моего atm, которая препятствует правильной инициализации приложения.
Комментарии:
1. В консоли firefox я получаю разные ошибки Error: f не определено и Error: App.Controllers.Fffforms не является конструктором.
Ответ №1:
Похоже, вы не включаете файл, который содержит объявление App.Controllers.Fffforms
. Убедитесь, что вы включаете этот файл где-то в свой код до того, как вы включаете application.js .
Комментарии:
1. Спасибо, я добавил еще несколько js, которых раньше не было, но все еще есть та же проблема.
Ответ №2:
Я предполагаю, что в вашем приложении есть своего рода механизм объединения. Убедитесь, что во всех файлах, входящих в комплект, правильно используются точки с запятой (;).
Ответ №3:
Мой ответ похож на ответ @ream88, но функция конвейера ресурсов Rails 3.1 заботится о минимизации, объединении и так далее, Поэтому я предпочитаю иметь не уменьшенные версии, доступные для отладки и т.д.
Итак, загрузите прокомментированную / полную версию 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 .
Поскольку backbone зависит от подчеркивания, это приведет к их загрузке в правильном порядке, что позволит избежать ошибки.
Комментарии:
1. Спасибо — моя глупость: подчеркивание должно быть первым. Является application.js и для //= требуется что-то rails?
Ответ №4:
Столкнулся с той же проблемой, а затем выяснил, что я нигде не включил underscore.js
. Итак, я написал простой backbone.js
файл:
/*
*= require backbone/underscore-min.js
*= require backbone/backbone-min.js
*/
и сохранил ее под vendor/assets/javascripts
вместе с файлами Backbone и подчеркивания:
vendor/assets/javascripts/
├── backbone
│ ├── backbone-min.js
│ └── underscore-min.js
└── backbone.js
Мой application.js.coffee
теперь выглядит примерно так:
#= require backbone
#= require query
Ответ №5:
Это просто задело меня, поэтому я подумал, что поделюсь своей находкой: убедитесь, что окончания строк вашего файла соответствуют файловой системе вашего сервера.