"Uncaught TypeError:undefined不是函数" - 初学者Backbone.js应用程序

jak*_*ake 38 javascript ruby-on-rails backbone.js ruby-on-rails-3

我正在建立一个非常简单的应用程序与骨干,我收到一个错误.

Uncaught TypeError: undefined is not a function example_app.js:7
ExampleApp.initialize example_app.js:7
(anonymous function)
Run Code Online (Sandbox Code Playgroud)

这是Chrome Inspector(init文件 - 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();
  }
};
Run Code Online (Sandbox Code Playgroud)

这是我的任务index.haml文件

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

= yield :javascript
Run Code Online (Sandbox Code Playgroud)

models/task.js

var Task = Backbone.Model.extend({});
Run Code Online (Sandbox Code Playgroud)

collections/tasks.js

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

routers/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);
    }
});
Run Code Online (Sandbox Code Playgroud)

这里证明我正在调用所有文件(我认为):

<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>
Run Code Online (Sandbox Code Playgroud)

任何想法都会很棒.谢谢!

Ale*_*yne 80

未捕获的TypeError:undefined不是函数example_app.js:7

此错误消息讲述了整个故事.在这一行,您正在尝试执行一个函数.然而,正在执行的任何东西都不是功能!相反,它是undefined.

那么example_app.js7 号线上有什么?看起来像这样:

var tasks = new ExampleApp.Collections.Tasks(data.tasks);
Run Code Online (Sandbox Code Playgroud)

该行只运行一个函数.我们发现了问题!ExampleApp.Collections.Tasksundefined.

所以让我们看一下声明的位置:

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

如果这是该集合的所有代码,那么根本原因就在这里.您将构造函数分配给全局变量,称为Tasks.但是你永远不会把它添加到ExampleApp.Collections对象中,这是你以后期望的对象.

改变这一点,我打赌你会好的.

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

了解正确的名称和行号在确定这一点时有多重要?永远不要将错误视为二进制(它可以工作或不工作).而是读取错误,在大多数情况下,错误消息本身会为您提供跟踪以找到真正问题所需的关键线索.


在Javascript中,当您执行一个函数时,它的评估如下:

expression.that('returns').aFunctionObject(); // js
execute -> expression.that('returns').aFunctionObject // what the JS engine does
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下,这是因为你没有放置你认为你做过的事情.

  • 如果你想学习,不要盲目地复制代码.阅读并尝试了解您复制的内容.如果您不知道是什么,请查阅.调试一个你不理解的程序是一种快速的方法,可以让你想把键盘扔出窗外. (33认同)