Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从Backbone.listenTo查找触发的事件?_Javascript_Backbone.js_Backbone Events_Backbone.js Collections - Fatal编程技术网

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

Javascript 如何从Backbone.listenTo查找触发的事件?,javascript,backbone.js,backbone-events,backbone.js-collections,Javascript,Backbone.js,Backbone Events,Backbone.js Collections,在主干中,我使用新的主干.listenTo事件。我的一个实例将侦听器连接到三个不同的事件,例如: this.listenTo(this._Collection, 'reset add change', this._setCollection); 它在应该调用的时候被恰当地调用,并且没有任何问题。我不知道的是如何找出触发的事件。我可以通过以下方式访问e参数: _setCollection: function(e) { // Do fun stuff } 问题是e参数只发送集合的一个副本

在主干中,我使用新的
主干.listenTo
事件。我的一个实例将侦听器连接到三个不同的事件,例如:

this.listenTo(this._Collection, 'reset add change', this._setCollection);
它在应该调用的时候被恰当地调用,并且没有任何问题。我不知道的是如何找出触发的事件。我可以通过以下方式访问
e
参数:

_setCollection: function(e) {
    // Do fun stuff
}
问题是
e
参数只发送集合的一个副本,而没有提及实际触发的事件。我尝试了
e.type
e.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_所指出的,答案太短了。正确的答案是使用多个处理程序,而不是执行这种类型的“欺骗”

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

  • “添加”(模型、集合、选项)-将模型添加到集合时
  • “重置”(收藏,选项)-当收藏的全部内容被替换时
  • “更改”(模型,选项)-当模型的属性发生更改时
幸运的是,这三个事件都有不同的参数,因此
参数的内容将唯一地(在本例中)确定触发事件:

  • 如果
    arguments[0]
    是一个模型,而
    arguments[1]
    是一个集合,那么就有一个
    “添加”
    事件
  • 如果
    参数[0]
    是一个集合,则有一个
    “重置”
    事件
  • 如果
    参数[0]
    是一个模型,并且
    参数.length
    是2,那么您就有一个
    “change”
    事件
  • 所以你可以在你的
    \u 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!');
        }
    
    演示:


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

    是的,完全同意。我发现了这个问题,因为我正在查看remove事件并将其全部包含在一个函数中。我注意到这些论点是不同的,我应该把它们放在问题中。无论如何,谢谢你的黑客攻击。我将为每个应用程序使用不同的处理程序。