私はBackbone.jsの初心者です。私はそれで遊んでいた。モデルがビューに関連しているかどうかを知りたいです。提供されている todos の例では、addOneメソッドに新しいビューが作成され、新しく作成されたモデルに関連付けられて追加されています。
window.AppView = Backbone.View.extend({
// view code
addOne: function(todo) {
var view = new TodoView({model: todo});
this.$("#todo-list").append(view.render().el);
}
}
同様のことをしようとすると、「バインドされたメソッドが未定義で見つからない」というエラーが表示されました。
window.TodoView = Backbone.View.extend({
initialize: function() {
_.bindAll(this, 'render', 'close');
this.model.bind('change', this.render); // I got the error at this place.
this.model.view = this;
}
});
これを解決するために、新しく作成したモデルをパラメーターとしてビューコンストラクターに渡し、this.model = task
それを関連付けるため。
window.TodoView = Backbone.View.extend({
initialize: function(task) {
_.bindAll(this, 'render', 'close');
this.model = task
this.model.bind('change', this.render);// now there is no error
this.model.view = this;
}
});
window.AppView = Backbone.View.extend({
insertTask:function(){
var newTask, newTaskView;
newTask = new Task(JSON.parse(xhr));
Tasks.create(newTask);
newTaskView = new TaskView({ model: newTask });
$("#todo_list").append(newTaskView.render().el);
this.input.val('');
}
});
しかし、todosの例では、そのようなものはありません。新しいモデルは、todosの例で暗黙的に新しいビューにどのように関連付けられていますか?
ありがとう
暗黙的ではありません。この行で明示的です:
var view = new TodoView({model: todo});
これは、新しいTodoView
ビューを作成し、そのmodel
プロパティをaddOne
関数の唯一のパラメーター(モデルであるtodo
)に設定しています。
新しいモデルがTodos
コレクションに追加されるたびに、addOne
メソッドが新しいモデルをパラメーターとして呼び出されます。
Todos.bind('add', this.addOne);
次に、addOne
で、そのモデルの新しいビューが作成され、{model: todo}
を介して関係が明示的に設定されます。これは、コードのバージョンに欠けているものです。
あなたがしようとしているように見えるのは、ビューの初期化関数でビューとモデルをリンクすることです、それは問題ありませんが、それを行う場合は自分で行います-つまり、モデルをセットアップする必要があります<->関係を自分で表示します(モデルをパラメーターとしてview init関数に渡すことで解決しました)。