gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 05:58:32 26 4
gpt4 key购买 nike

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

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

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

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

问题在于 e 参数仅发送集合的副本,而没有提及实际触发的事件。我试过 e.typee.target 但这些对象不存在。这是来自 Chrome 开发工具的 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 所指出的,正确的答案是使用多个处理程序而不是执行这种类型的“欺骗”

最佳答案

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

  • "add" (model, collection, options) — when a model is added to a collection.
  • "reset" (collection, options) — when the collection's entire contents have been replaced.
  • "change" (model, options) — when a model's attributes have changed.

幸运的是,所有这三个事件都有不同的参数,因此 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/

不过,我不推荐这种诡计,它很笨拙、脆弱,如果您向列表中添加更多事件类型,它可能会崩溃。如果您的事件处理程序需要知道触发它的事件类型,那么您最好为每种事件类型使用单独的处理程序:三个函数和三个 listenTo 调用比一小堆丑陋的 hackery 更好.

关于javascript - 如何从 Backbone.listenTo 中查找触发事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14248801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com