我是Backbone.js的新手。我只是玩弄它。我想知道该模型是否与View相关。在提供的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);
}
}
当我尝试做类似的事情时,我收到一条错误,说“在undefined上找不到绑定方法”。
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示例中隐含地与新视图相关联?
由于
答案 0 :(得分:37)
这根本不是隐含的,它在这一行显而易见:
var view = new TodoView({model: todo});
这是创建一个新的TodoView
视图,并将其model
属性设置为addOne
函数的唯一参数(todo
,这是一个模型)。
每当将新模型添加到Todos
集合时,将使用新模型作为参数调用addOne
方法。
Todos.bind('add', this.addOne);
然后,在addOne
中,为该模型创建一个新视图,并通过{model: todo}
明确设置关系。我怀疑,这是您的代码版本中缺少的内容。
你似乎试图做的是在视图的init函数中链接视图和模型,这没关系,但是如果你这样做就是你自己 - 这意味着你需要设置模型< - >查看自己的关系(通过将模型作为参数传递给视图init函数来解决)。