我在这里有这个工作代码。
我之前的下划线模板中有一个错误,我注意到的是,模型没有保存到数据库,因为渲染因模板不正确而无法正常工作。这应该意味着在渲染之后调用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);
}
});
});
答案 0 :(得分:1)
上述代码无法确定是否成功保存了模型数据。您没有附加模型上的“sync”事件,该事件在服务器上成功创建模型时调用。如果在保存模型时出现任何问题,您也不会附加“错误”事件。
Collection.create直接调用Model.save。
答案 1 :(得分: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
。