我在 JS Fiddle 上创建了一个简单的 Todo 应用程序来学习 Backbone.JS。我有一个TodosModuleView
包装表单并TodosView
呈现 Todos 集合
window.TodosModuleView = Backbone.View.extend({
tagName: 'section',
id: 'todoModule',
events: {
'keypress #frmTodo input[type=text]': 'addTodo'
},
initialize: function() {
_.bindAll(this, 'render',
'addTodo');
this.collection.bind('reset', this.render);
this.template = _.template($('#todosModuleTmpl').html()); },
render: function() {
console.log('rendering...');
var todosView = new TodosView({ collection: this.collection });
this.$el.html(this.template({}));
this.$el.append(todosView.render().el);
return this;
},
addTodo: function(e) {
if (e.keyCode !== 13)
return;
var todo = new Todo({ title: this.$('input[name=todo]').val() });
this.collection.add(todo);
console.log('added!');
return false;
}
});
当我添加一个待办事项时,我可以看到它已添加到集合中,但它似乎没有触发render()
. 此外,由于我使用的是本地存储存储,我希望我新添加的 Todos 应该在下次刷新时持久化并呈现,但这似乎不会发生。查看 Chrome 的开发人员工具栏,我在本地存储中看不到任何内容
更新
@mashingan 的回答解决了第一个问题:使用add
而不是reset
事件。现在我的本地存储出了什么问题?
window.Todos = Backbone.Collection.extend({
model: Todo,
localStorage: new Backbone.LocalStorage('todos')
});
可能是变量是按值传递的,而不是像我期望的那样按引用传递吗?我有一个TodosModuleView
用来TodosView
呈现待办事项列表的,也许我做错了?