在 backbone.js 中传递事件的视图上下文
Passing context of view on event in backbone.js
我的 Backbone 视图存在上下文问题/设计问题。
目标
用户在单独的视图中从列表/用户集合中选择了一个用户。
上述视图传递了 editUserView
接收到的全局事件 ("edit-contact"
)。
editUserView
应接收此事件并提取(用户)model.id
属性。通过使用此 model.id
我想使用从现有视图模型 Tsms.Collection.Users
.
检索到的相应对象更新视图
问题
传递给 updateView
函数的上下文是错误的,因此我无法访问父视图 .render()
函数。调试器状态 "render() is not a function".
由于上下文不是父视图的上下文,我也无法设置 this.current
变量。
我该如何解决这个问题?
查看代码
Tsms.Views.editUserView = Backbone.View.extend({
model: Tsms.Collections.Users,
initialize: function(options) {
Tsms.require_template('edituser')
this.template = _.template($('#template_edituser').html());
this.current = -1;
Tsms.vent.on('edit-contact', this.updateView)
},
updateView: function(model) {
this.current = model.id;
this.render();
},
render: function() {
this.$el.html(this.template(this.model.get(this.current).attributes));
return this;
}
});
Backbone's on
实际上需要三个参数:
on object.on(event, callback, [context])
[...]
To supply a context value for this
when the callback is invoked, pass the optional last argument: model.on('change', this.render, this)
or model.on({change: this.render}, this)
.
解决您问题的最简单且(当前)最惯用的方法是使用第三个 context
参数:
Tsms.vent.on('edit-contact', this.updateView, this);
同时 is right, you should use Backbone's listenTo
to avoid memory leaks(僵尸视图)。
this.listenTo(Tsms.vent, 'edit-contact', this.updateView);
上下文自动设置为this
,调用视图。
当 remove
is called on the view, stopListening
被调用并且为事件保留的任何引用被删除时。
避免on
的另一个原因是它应该是负责它想要处理的事件的视图,事件总线不应该知道。
我的 Backbone 视图存在上下文问题/设计问题。
目标
用户在单独的视图中从列表/用户集合中选择了一个用户。
上述视图传递了
editUserView
接收到的全局事件 ("edit-contact"
)。editUserView
应接收此事件并提取(用户)model.id
属性。通过使用此model.id
我想使用从现有视图模型Tsms.Collection.Users
. 检索到的相应对象更新视图
问题
传递给 updateView
函数的上下文是错误的,因此我无法访问父视图 .render()
函数。调试器状态 "render() is not a function".
由于上下文不是父视图的上下文,我也无法设置 this.current
变量。
我该如何解决这个问题?
查看代码
Tsms.Views.editUserView = Backbone.View.extend({
model: Tsms.Collections.Users,
initialize: function(options) {
Tsms.require_template('edituser')
this.template = _.template($('#template_edituser').html());
this.current = -1;
Tsms.vent.on('edit-contact', this.updateView)
},
updateView: function(model) {
this.current = model.id;
this.render();
},
render: function() {
this.$el.html(this.template(this.model.get(this.current).attributes));
return this;
}
});
Backbone's on
实际上需要三个参数:
on
object.on(event, callback, [context])
[...]To supply a context value for
this
when the callback is invoked, pass the optional last argument:model.on('change', this.render, this)
ormodel.on({change: this.render}, this)
.
解决您问题的最简单且(当前)最惯用的方法是使用第三个 context
参数:
Tsms.vent.on('edit-contact', this.updateView, this);
同时 listenTo
to avoid memory leaks(僵尸视图)。
this.listenTo(Tsms.vent, 'edit-contact', this.updateView);
上下文自动设置为this
,调用视图。
当 remove
is called on the view, stopListening
被调用并且为事件保留的任何引用被删除时。
避免on
的另一个原因是它应该是负责它想要处理的事件的视图,事件总线不应该知道。