在Backbone中,我正在使用新的Backbone.listenTo
事件。我的一个实例让听众附加了三个不同的事件,例如:
this.listenTo(this._Collection, 'reset add change', this._setCollection);
当它应该被称为适当时,并且那里没有问题。我不知道的是如何找出触发了哪个事件。我可以使用:
访问e
参数
_setCollection: function(e) {
// Do fun stuff
}
问题是e
参数只发送集合的副本,而没有提到实际触发了什么事件。我尝试过e.type
和e.target
,但这些对象不存在。以下是Chrome Dev工具中e
对象的副本:
_byCid: Object
_byId: Object
_events: Object
add: Array[1]
change: Array[1]
remove: Array[1]
reset: Array[1]
__proto__: Object
_listenerId: "l16"
length: 3
models: Array[3]
如何找到触发的事件?
编辑:答案澄清:尽管明确的答案在技术上是正确的,但正如mu_is_too_short所指出的那样,正确答案是使用多个处理程序而不是执行此类“chicanery”
答案 0 :(得分:9)
您无法直接检测事件类型,但在某些情况下,您可以从arguments
推断出事件类型。 events catalog可以这样说:
- “添加”(模型,集合,选项) - 将模型添加到集合中时。
- “重置”(集合,选项) - 当集合的全部内容被替换时。
- “更改”(型号,选项) - 模型的属性发生变化时。
幸运的是,这三个事件都有不同的参数,因此arguments
的内容将唯一(在这种情况下)确定触发事件:
arguments[0]
是模型且arguments[1]
是一个集合,那么您有一个"add"
事件。arguments[0]
是一个集合,那么您有一个"reset"
事件。arguments[0]
是模型且arguments.length
为2,那么您有"change"
个事件。所以你可以在_setCollection
:
// M is your model, C is your collection.
if(arguments[0] instanceof M
&& arguments[1] instanceof C) {
// An "add" event...
}
else if(arguments[0] instanceof C) {
// A "reset" event...
}
else if(arguments[0] instanceof M
&& arguments.length == 2) {
// A "change" event...
}
else {
console.log('confusion!');
}
演示:http://jsfiddle.net/ambiguous/Y9UUX/
我不推荐这种类型的chicanery,它是kludgey,脆弱,如果你在列表中添加更多的事件类型,可能会破坏。如果您的事件处理程序需要知道触发它的事件类型,那么您最好为每种事件类型使用单独的处理程序:三个函数和三个listenTo
调用比一小堆丑陋的hackery更好。