在事件回调中获取对模型的引用
Getting a reference to a model in an event callback
我不确定我是否做对了,第一次玩Backbone.js。
我有两个模型的视图,我想使用事件聚合器方法来触发两者之间的事件。
聚合器声明:
Backbone.View.prototype.eventAggregator = _.extend({}, Backbone.Events);
因此,在一个视图中,我有这样一行将触发removeRow
方法。
this.eventAggregator.trigger("removeRow", this.row);
在另一个视图中
MyView = Backbone.View.extend({
initialize: function() {
this.eventAggregator.bind("removeRow", this.removeRow);
this.model.get("rows").each(function(row) {
// Do stuff
});
},
removeRow: function(row) {
// row is passed in fine
// this.model is undefined
this.model.get("rows").remove(row);
}
});
我想我明白为什么this.model
是未定义的,但是我该怎么做来维护引用以便我可以在回调中使用this.model
?我想过将模型传递给第一个视图,然后在trigger
调用中将其传递回去,但这似乎使事件聚合器的整个要点毫无意义。如果我有模型,我可以直接调用.remove
方法,并且失去了我的第一个视图不知道模型的好处。有什么建议吗?
我认为你有绑定问题。
有两种方法可以确保this
将是 View 实例:
1. 使用bindAll
在View.initialize()
中添加以下行:
_.bindAll( this, "removeRow" )
关于此事的有趣@DerickBailey帖子
2. 在绑定声明中使用可选的第三个参数
喜欢这个:
this.eventAggregator.bind("removeRow", this.removeRow, this);
关于此事的骨干文档
提供 View 对象作为绑定方法的第三个参数:
this.eventAggregator.bind("removeRow", this.removeRow, this);
第三个参数是调用回调的上下文。请参阅文档。
另外,你可以用 .on() 代替更短的 .bind() ...
您需要绑定this
,以免丢失范围。另一个答案上的博客链接使用下划线的bindAll
initialize: function() {
_.bindAll(this, 'removeRow');
this.eventAggregator.bind("removeRow", this.removeRow);
this.model.get("rows").each(function(row) {
// Do stuff
});
},
相关文章:
- 引用单个表的多列 - Sails JS API 模型
- 将ng模型设置为与变量同名,而不是引用该变量
- 骨干模型克隆创建对原始模型的引用
- 该对象错过了您对模型的引用
- 强制DOM在$scope模型对工厂模型的引用发生更改时进行渲染
- 在挖空中引用对象构造函数外部视图模型的属性
- 主干:在回调中维护对模型的“this”引用的最简单方法
- 在事件回调中获取对模型的引用
- 在 Knockout.js 中选择更改时引用当前模型项调用函数
- 执行 Backbone where 和 findWhere 按值或引用返回模型
- mongoDB:在具有父引用的模型树结构中查找缺失的文档
- 如果一个模型在续集中引用自身,如何让所有孩子或父母在多对多关联中
- 从集合中引用模型
- 如何使用指令和引用元素来更改模型
- 将嵌套文档集合转换为具有父引用的模型树结构
- 在另一个模型中引用/填充猫鼬模型时出现问题
- 将模型引用直接传递给HTML元素是否正确
- 引用模型的ObjectId有自己的时间戳吗?(Mongoose v3.6.15)
- 在Express中使用Mongoose将一个模型引用到一个用户模型
- 当你克隆一个主干.集合是完整的模型引用