5

在 Backbone 中,我正在使用新Backbone.listenTo事件。我的一个实例将侦听器附加到三个不同的事件,例如:

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

当它应该被适当地调用并且那里没有问题时,它会被适当地调用。我不知道如何找出触发了哪个事件。我可以使用以下方法访问e参数:

_setCollection: function(e) {
    // Do fun stuff
}

问题是该e参数仅发送集合的副本,并没有提及实际触发的事件。我试过了e.typee.target但那些对象不存在。e这是来自 Chrome 开发工具的对象的副本:

_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 所指出的,正确的答案是使用多个处理程序而不是执行这种类型的“诡计”

4

1 回答 1

9

您无法直接检测事件类型,但在某些情况下,您可以从arguments. 活动目录有这样的说法:

  • "add" (model, collection, options) — 将模型添加到集合时。
  • "reset" (collection, options) — 当集合的全部内容被替换时。
  • "change" (model, options) — 当模型的属性发生变化时。

幸运的是,所有这三个事件都有不同的参数,因此 的内容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!');
    }

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

I wouldn't recommend this sort of chicanery though, it is kludgey, fragile, and can break if you add more event types to the list. If your event handler needs to know what sort of event triggered it then you'd be better off using separate handlers for each event type: three functions and three listenTo calls are better than a small pile of ugly hackery.

于 2013-01-10T00:42:46.793 回答