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

时间:2011-04-26 22:56:24

标签: javascript ruby-on-rails ajax ruby-on-rails-3 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项目(而不是该回购的克隆版)的复制并不完全有效。

任何建议都值得赞赏,记住我刚开始学习一些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正常启动。

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

请下载评论/完整版backbone.jsunderscore.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)

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