Backbone.JSを学習するために、JSFiddleで簡単なTodoアプリケーションを作成しました。フォームをTodosModuleView
ラップし、TodosView
Todoのコレクションをレンダリングするがあります
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;
}
});
ToDoを追加すると、コレクションに追加されたことがわかりますが、トリガーされていないようrender()
です。また、ローカルストレージストアを使用しているので、新しく追加したTodoは永続化され、次の更新時にレンダリングされるはずですが、それは発生しないようです。Chromeの開発者ツールバーを見ると、ローカルストレージに何も表示されません
アップデート
@mashinganの答えで解決された最初の問題:イベントadd
の代わりに使用しreset
ます。ローカルストレージの何が問題になっていますか?
window.Todos = Backbone.Collection.extend({
model: Todo,
localStorage: new Backbone.LocalStorage('todos')
});
私が期待するように、変数が参照ではなく値によって渡される可能性がありますか?私はtodoリストをレンダリングするためにTodosModuleView
使用するを持っていTodosView
ます、多分私はそれを間違った方法でやっていますか?