0

我在这里有这个工作代码。

我之前在下划线模板中有一个错误,我注意到,模型没有被保存到数据库中,因为由于模板错误,渲染无法正常工作。这应该意味着 model.save() 在渲染后被调用。或者,collections.create() 完成了所有的保存工作,而 model.save() 根本没有被调用?

下面的代码究竟是如何将模型数据保存在数据库中的?

$(function(){
Todos = new TodoList.Collections.Todos;
TodoList.Views.TodoView = Backbone.View.extend({
    tagName: "li",
    events: {},
    initialize: function(){},
    template: _.template('<li> <%= task %></li>'),
    render: function(){
        var todo = this.model.toJSON();
        //alert("render: " + JSON.stringify(todo));
        return this.template(todo);
    }
});

TodoView = TodoList.Views.TodoView;

TodoList.Views.AppView = Backbone.View.extend({
    el: $("#todo_app"),
    events: {
        "submit form#new_todo": "createTodo",
        "click div.new-todo-btn" : "showFormNew"
    },
    showFormNew: function(){
        $(".new-todo-form").toggle();
    },
    initialize: function(){
        _.bindAll(this, 'addOne', 'addAll','render');
        Todos.bind("add", this.addOne);
        Todos.bind("reset", this.addAll);
        Todos.bind("all", this.render);
        Todos.fetch();
    },

    addOne: function(todo){
        var view = new TodoView({model: todo});
        this.$("#todo_list").append(view.render());
    },

    addAll: function(){
        Todos.each(this.addOne);
    },

    newAttributes: function(event){
        var new_todo_form = $(event.currentTarget).serializeObject();
        return {
                'task': new_todo_form["todo[task]"],
                'done': new_todo_form["todo[done]"]
        };
    },

    createTodo: function (e){
        e.preventDefault();
        var params = this.newAttributes(e);
        Todos.create(params);
    }
});
});
4

2 回答 2

1

完全不确定上面的代码是否成功保存了模型数据。您没有附加到模型上的“同步”事件,该事件是在服务器上成功创建模型时调用的。您也没有附加到“错误”事件,如果保存模型有任何问题,该事件将被触发。

Collection.create 直接调用 Model.save 顺便说一句。

于 2012-06-23T11:22:08.290 回答
1

如果您想知道任何特定的backbone.js 方法中发生了什么,那么带注释的源代码真的很有用。Backbone 源非常小,而且很容易理解。

http://documentcloud.github.com/backbone/docs/backbone.html#section-99

您可以看到它Collection.create确实调用了该model.save方法,除非模型验证失败。

这里的事件顺序是(如果没有错误):

  • 用户填写new_todo表格并提交。
  • createTodo方法被调用,该方法调用 TodoList.create。
  • Collection.create来电model.save
  • 传递给的成功回调model.save会将新模型添加到集合中。
  • add事件在集合上触发,导致TodoList.addOne调用创建新的TodoView.
于 2012-06-23T11:48:28.600 回答