我正在用主干网设置一个非常简单的应用程序,但我遇到了一个错误.

Uncaught TypeError: undefined is not a function example_app.js:7
ExampleApp.initialize example_app.js:7
(anonymous function)

这就是Chrome Inspector(初始化文件-example_app.js)中显示错误的地方:

var ExampleApp = {
  Models: {},
  Collections: {},
  Views: {},
  Routers: {},
  initialize: function() {
    var tasks = new ExampleApp.Collections.Tasks(data.tasks);
    new ExampleApp.Routers.Tasks({ tasks: tasks });
    Backbone.history.start();
  }
};

这是我的任务索引.haml文件

- content_for :javascript do
  - javascript_tag do
    ExampleApp.initialize({ tasks: #{raw @tasks.to_json} });

= yield :javascript

模型/任务.js

var Task = Backbone.Model.extend({});

收集/任务.js

var Tasks = Backbone.Collection.extend({
    model: Task,
    url: '/tasks'
});

路由/任务.js

ExampleApp.Routers.Tasks = Backbone.Router.extend({
    routes: {
        "": "index"
    },

    index: function() {
        alert('test');
        // var view = new ExampleApp.Views.TaskIndex({ collection: ExampleApp.tasks });
        // $('body').html(view.render().$el);
    }
});

以下是我调用所有文件的证据(我认为):

<script src="/assets/jquery.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_ujs.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery-ui.js?body=1" type="text/javascript"></script>
<script src="/assets/underscore.js?body=1" type="text/javascript"></script>
<script src="/assets/backbone.js?body=1" type="text/javascript"></script>
<script src="/assets/backbone-support/support.js?body=1" type="text/javascript"></script>
<script src="/assets/backbone-support/composite_view.js?body=1" type="text/javascript"></script>
<script src="/assets/backbone-support/swapping_router.js?body=1" type="text/javascript"></script>
<script src="/assets/backbone-support.js?body=1" type="text/javascript"></script>
<script src="/assets/example_app.js?body=1" type="text/javascript"></script>
<script src="/assets/easing.js?body=1" type="text/javascript"></script>
<script src="/assets/modernizr.js?body=1" type="text/javascript"></script>
<script src="/assets/models/task.js?body=1" type="text/javascript"></script>
<script src="/assets/collections/tasks.js?body=1" type="text/javascript"></script>
<script src="/assets/views/task_view.js?body=1" type="text/javascript"></script>
<script src="/assets/views/tasks.js?body=1" type="text/javascript"></script>
<script src="/assets/views/tasks_index.js?body=1" type="text/javascript"></script>
<script src="/assets/routers/tasks.js?body=1" type="text/javascript"></script>
<script src="/assets/tasks/index.js?body=1" type="text/javascript"></script>
<script src="/assets/tasks/task.js?body=1" type="text/javascript"></script>
<script src="/assets/application.js?body=1" type="text/javascript"></script>

任何 idea 都很好.谢谢

推荐答案

Uncaught TypeError:undefined不是一个函数示例.js:7

这个错误消息说明了整个情况.在这一行中,您正试图执行一个函数.然而,无论执行什么,都不是一个函数!相反,它是undefined.

那么第7行的example_app.js是什么?看起来像这样:

var tasks = new ExampleApp.Collections.Tasks(data.tasks);

该行上只运行一个函数.我们发现了问题!ExampleApp.Collections.Tasks等于undefined.

那么让我们看看这是在哪里宣布的:

var Tasks = Backbone.Collection.extend({
    model: Task,
    url: '/tasks'
});

如果这就是这个集合的全部代码,那么根本原因就在这里.将构造函数赋给名为Tasks的全局变量.但你永远不会将其添加到ExampleApp.Collections对象中,这是你以后期望的地方.

换成这个,我打赌你会很好.

ExampleApp.Collections.Tasks = Backbone.Collection.extend({
    model: Task,
    url: '/tasks'
});

看看专有名称和行号在解决这个问题上有多重要?永远不要将错误视为二进制(它工作或不工作).相反,阅读错误信息,在大多数情况下,错误信息本身会为您提供关键线索,您需要通过这些线索来找到真正的问题.


在Javascript中,当执行函数时,它的计算方式如下:

expression.that('returns').aFunctionObject(); // js
execute -> expression.that('returns').aFunctionObject // what the JS engine does

这个表达式可能很复杂.所以当你看到undefined is not a function,这意味着表达式没有返回函数对象.所以你必须弄清楚为什么你试图执行的不是一个函数.

在这种情况下,是因为你没有把东西放在你认为你放的地方.

Ruby-on-rails相关问答推荐

在has_many关系中由两个条件 Select

Rails 7中的Turbo流

Ruby/Rails 相当于 Python 的 sys.addAuditHook

用变量替换 find_or_create_by 中的键

Turbo-Rails:如何将 Turbo Frame 添加到 `application.html.erb`?

如何为 I18n 设置 raise_on_missing_translations

比较 Rails 中的日期

如何让 Rspec 运行嵌套在文件夹下的所有测试?

如何独立测试模型的回调方法?

具有 has_many 关联的 FactoryGirl build_stubbed 策略

如何在 Rails 中测试助手?

在 Ruby on Rails 中循环对象属性

'respond_to' 格式语句中的 `:location => ...` 和 `head :ok` 是什么意思?

如何在 Ruby 中搜索数组?

如何翻译 ActiveRecord 模型类名称?

Ruby on Rails 3:通过 Rails 将数据流式传输到客户端

扩展 Devise SessionsController 以使用 JSON 进行身份验证

Ruby 中有与 slice 函数相反的函数吗?

Rails:如何将日期时间字符串解析为特定时区

我什么时候需要在 Rails 中重新启动服务器?