如何从Backbone.listenTo查找触发事件?

Bra*_*don 5 javascript backbone.js backbone-events backbone.js-collections

在Backbone中,我正在使用新Backbone.listenTo事件.我的一个实例让听众附加了三个不同的事件,例如:

this.listenTo(this._Collection, 'reset add change', this._setCollection);
Run Code Online (Sandbox Code Playgroud)

当它被认为是适当的时候被称为并且那里没有问题.我不知道的是如何找出触发了哪个事件.我可以使用以下方法访问e参数:

_setCollection: function(e) {
    // Do fun stuff
}
Run Code Online (Sandbox Code Playgroud)

问题是e参数只发送集合的副本,而没有提到实际触发了什么事件.我试过了e.type,e.target但那些物品不存在.以下是eChrome Dev工具中对象的副本:

_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]
Run Code Online (Sandbox Code Playgroud)

如何找到触发的事件?

编辑:答案澄清:尽管标记的答案在技术上是正确的,正如mu_is_too_short所指出的,正确答案是使用多个处理程序而不执行此类"chicanery"

mu *_*ort 9

您无法直接检测事件类型,但在某些情况下,您可以从中推断出事件类型arguments.该活动目录有这样一段话:

  • "添加"(模型,集合,选项) - 将模型添加到集合时.
  • "reset"(集合,选项) - 当集合的全部内容被替换时.
  • "更改"(模型,选项) - 当模型的属性发生变化时.

幸运的是,这三个事件都有不同的参数,因此arguments唯一的内容(在这种情况下)将决定触发事件:

  1. 如果arguments[0]是模型并且arguments[1]是一个集合,那么您有一个"add"事件.
  2. 如果arguments[0]是一个集合,那么你有一个"reset"事件.
  3. 如果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!');
    }
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/ambiguous/Y9UUX/

我不推荐这种类型的chicanery,它是kludgey,脆弱,并且如果你向列表添加更多的事件类型可以打破.如果您的事件处理程序需要知道触发它的事件类型,那么您最好为每种事件类型使用单独的处理程序:三个函数和三个listenTo调用比一堆丑陋的hackery更好.