未捕获的TypeError:undefined不是函数rails3 / backbone / js

我刚刚开始深入研究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项目(不是该repo的克隆)的复制并不完全有效。

任何建议表示赞赏,记住我刚开始学习一些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 ddextend.readyjquery.min.js:16 dcaddEventListener.yjquery.min.js:16 

鉴于我现在只是复制,除了我以外,必须有一些小的被忽视的细节阻止App正常启动。

听起来你没有包含持有App.Controllers.Fffforms声明的App.Controllers.Fffforms 。 确保在包含application.js的位置之前将该文件包含在代码中的某个位置。

我认为你的应用程序中有一种捆绑机制。 确保所有文件都在所有捆绑文件中正确使用分号(;)。

我的回答类似于@ ream88,但是Rails 3.1+ Asset Pipelinefunction负责缩小,捆绑等等,所以我更喜欢将未缩小的版本用于调试等。

因此,下载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 . 

因为主干依赖于下划线,这将导致它们以正确的顺序加载,从而避免错误。

遇到同样的问题,然后我发现我没有在任何地方包含underscore.js 。 所以我写了一个简单的backbone.js文件:

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

并将其与Backbone和Underscore文件一起存储在vendor/assets/javascripts下:

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

我的application.js.coffee现在看起来像这样:

 #= require backbone #= require query 

这只是咬我,所以我想我会分享我的发现:确保你的文件的行结尾与你服务器的文件系统相匹配。