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

时间:2013-01-10 00:16:48

标签: javascript backbone.js backbone-events backbone-collections

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

this.listenTo(this._Collection, 'reset add change', this._setCollection);

当它应该被称为适当时,并且那里没有问题。我不知道的是如何找出触发了哪个事件。我可以使用:

访问e参数
_setCollection: function(e) {
    // Do fun stuff
}

问题是e参数只发送集合的副本,而没有提到实际触发了什么事件。我尝试过e.typee.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”

1 个答案:

答案 0 :(得分:9)

您无法直接检测事件类型,但在某些情况下,您可以从arguments推断出事件类型。 events catalog可以这样说:

  
      
  • “添加”(模型,集合,选项) - 将模型添加到集合中时。
  •   
  • “重置”(集合,选项) - 当集合的全部内容被替换时。
  •   
  • “更改”(型号,选项) - 模型的属性发生变化时。
  •   

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

  1. 如果arguments[0]是模型且arguments[1]是一个集合,那么您有一个"add"事件。
  2. 如果arguments[0]是一个集合,那么您有一个"reset"事件。
  3. 如果arguments[0]是模型且arguments.length为2,那么您有"change"个事件。
  4. 所以你可以在_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更好。