【问题标题】:Backbone.js Uncaught TypeError: Object [object Object] has no method 'create'Backbone.js Uncaught TypeError: Object [object Object] has no method 'create'
【发布时间】:2012-08-30 05:19:19
【问题描述】:

为什么我会收到错误消息:“未捕获的 TypeError: Object [object Object] has no method 'create'”

我试图靠近这个backbone todo example code

http://jsfiddle.net/GhaPF/4/

$(document).ready(function() {

    var ToDo = Backbone.Model.extend({
        defaults: { "date": "today",
                    "task": ""
                },
        initialize: function() {}
    });

    var ToDoList = Backbone.Model.extend({
        model: ToDo
    });

    var ToDoListView = Backbone.View.extend({
        el: 'body',
        initialize: function(myTodoList) {
            this.todolist = myTodoList;
            this.todolist.bind('change', this.render, this);
        },
        render: function() {
            text = this.todolist.toJSON();
            string = JSON.stringify(text);
            $(this.el).append(string);
            return this;
        },
        events: {
            "keypress #new-todo":  "createOnEnter"
        },
        createOnEnter: function(e) {
          if (e.keyCode != 13) return;
          if (!$("#new-todo").val()) return;
          this.todolist.create({"task": $("#new-todo").val()});
          $("#new-todo").val('');
        }
    });

    var todolist = new ToDoList();
    var myToDoListView = new ToDoListView(todolist);

});

我有两个错误:

  1. 将 ToDoList 定义为模型而不是集合
  2. 在集合上使用了 save() 而不是 add(),这触发了对不存在的 URL 的搜索

这是我想在这里实现的工作代码:

$(document).ready(function() {

    var ToDo = Backbone.Model.extend({
        defaults: { "date": "today",
                    "task": ""
                },
        initialize: function() {}
    });

    var ToDoList = Backbone.Collection.extend({
        model: ToDo
    });

    var ToDoListView = Backbone.View.extend({
        el: 'body',
        initialize: function(myTodoList) {
            this.todolist = myTodoList;
            this.todolist.bind('add', this.render, this);
        },
        render: function() {
            text = this.todolist.toJSON();
            string = JSON.stringify(text);
            $(this.el).append(string);
            return this;
        },
        events: {
            "keypress #new-todo":  "createOnEnter"
        },
        createOnEnter: function(e) {
          if (e.keyCode != 13) return;
          if (!$("#new-todo").val()) return;
          this.todolist.add({"task": $("#new-todo").val()});
          //this.render();
          $("#new-todo").val('');
        }
    });

    var todolist = new ToDoList();
    var myToDoListView = new ToDoListView(todolist);

});

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    看起来是因为您的 ToDoList 正在扩展 Backbone.Model。它应该扩展 Backbone.Collection。

    这是修复它的代码。

    var ToDoList = Backbone.Collection.extend({
      model: ToDo,
      url: '/todos' 
    }); 
    

    【讨论】:

    • 对了!谢谢。但现在我有另一个错误:“未捕获的错误:必须指定“url”属性或函数”。 jsfiddle.net/GhaPF/5
    • 由于 create 函数将模型保存到服务器,因此您必须将 url 属性添加到集合中,以便它知道在服务器上调用哪个 url 来添加模型。参见网址文档:backbonejs.org/#Collection-url
    • 谢谢!我把 save() 和 add() 搞混了。
    猜你喜欢
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多