【问题标题】:Uncaught TypeError: undefined is not a function rails3/backbone/jsUncaught TypeError: undefined is not a function rails3/backbone/js
【发布时间】:2011-08-13 10:28:57
【问题描述】:

我刚刚开始研究 javascript 以使项目更具响应性,我正在研究一个主干.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 all 不是。现在所有脚本都将进入浏览器(包括控制器)。不幸的是,这并不能解决最初的问题,只会在加载时产生更多错误,从 chrome js 控制台中的 App init 流出:

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 之外肯定有一些被忽略的小细节阻止了应用程序正确启动。

【问题讨论】:

  • 在 Firefox 控制台中我得到不同的错误错误:f 未定义和错误:App.Controllers.Fffforms 不是构造函数。

标签: javascript ruby-on-rails ajax ruby-on-rails-3 backbone.js


【解决方案1】:

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

【讨论】:

  • 谢谢,我又引入了一些之前没有的js,但还是有同样的问题。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我的回答与@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 .
    

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

    【讨论】:

    • 谢谢 - 我的愚蠢:下划线必须放在第一位。 application.js 和 //= 是否需要 rails 的东西?
    【解决方案4】:

    遇到了同样的问题,然后我发现我没有在任何地方包含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
    

    【讨论】:

      【解决方案5】:

      这让我很生气,所以我想分享一下我的发现:确保文件的行尾与服务器的文件系统匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-15
        • 2015-01-14
        • 2014-07-06
        • 2014-09-01
        • 2015-11-04
        • 2013-03-06
        相关资源
        最近更新 更多