我刚刚开始深入研究javascript以使项目更具响应性,我正在研究backbone.js示例。
我在新的Rails 3项目中复制了http://www.jamesyu.org/2011/01/27/cloudedit-a-backbone-js-tutorial-by-example/。
我运行项目并转到主页....并且/#之间有一个链接,没有别的。查看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都不是。现在所有脚本都将进入浏览器(包括控制器)。不幸的是,这并没有解决原始问题,只是在加载时出现更多错误,从app init流出,这是在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
鉴于我现在只是在复制,除了我以外,必须有一些小的被忽视的细节阻止App正常启动。
答案 0 :(得分:7)
听起来你没有包含保存App.Controllers.Fffforms
声明的文件。确保在包含application.js之前将代码放在代码中的某个位置。
答案 1 :(得分:2)
我认为你的应用程序中存在一种捆绑机制。确保所有文件在所有捆绑文件中都使用了分号(;)。
答案 2 :(得分:2)
我的回答类似于@ 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 .
因为骨干依赖于下划线,这将导致它们以正确的顺序加载,从而避免错误。
答案 3 :(得分:1)
遇到同样的问题,然后我发现我没有把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
答案 4 :(得分:1)
这只是我的意思,所以我想我会分享我的发现:确保你的文件的行结尾与你服务器的文件系统相匹配。