【问题标题】:ExtJS listeners: anonymous function parametersExtJS 监听器:匿名函数参数
【发布时间】:2011-03-25 00:14:28
【问题描述】:

我从网上看到的某本书中获取了这段代码……

sm: new Ext.grid.RowSelectionModel({
   singleSelect: true,
   listeners: {
       rowselect: {
           fn: function(sm,index,record) {
               Ext.Msg.alert('You Selected',record.data.title);
           }
       }
   }
});

现在,sm 是选择模型的简写,我们在这里讨论 ExtJS GridPanel...在fn: 部分之前一切都很清楚。 AFAIK,一个匿名函数通过 3 个参数传递:sm、索引和记录。

现在我因为问一些极其琐碎的问题而被否决:你怎么知道应该传递哪些参数?如果我省略 index 参数,我会得到一个错误... 为什么我 必须 传递 3 个参数?有什么收获?

【问题讨论】:

    标签: javascript extjs listener anonymous-function


    【解决方案1】:

    参数不按名称传递;它们通过“位置”传递(就像在大多数其他脚本和编程语言中一样)。回调必须有三个参数,因为调用者将提供三个参数;如果不匹配,则会发生错误。

    【讨论】:

    • 我知道这里正在使用位置匹配的事实......我不明白的是为什么我必须传递3个参数:一个用于选择模型,第二个用于索引,第三个用于网格中的数据值?
    • 抱歉,RTFM 问题...来自官方文档的块:rowselect : ( SelectionModel this, Number rowIndex, Ext.data.Record r ) 所以,一个 rtard 终于明白了:这是一个特定于事件的函数!
    • 不,这不是原因。您必须在函数中接受三个参数的原因是因为 extJS 期望您接受它们。请参阅@IgorZevaka 的回答以获得更详尽的解释。
    【解决方案2】:

    考虑这种情况:

    //called with (selectionModelInstance, Index, Record)
    function myCallback(sm,index,record) {
      //Parameter mapping:
      //sm -> selectionModelInstance
      //index -> Index
      //record -> Record
      alert(record.data);
      //record is actually a record object, so record.data works
    }
    

    观察跳过参数时会发生什么:

    //called with (selectionModelInstance, Index, Record)
    function myCallback(sm,record) {
      //Parameter mapping:
      //sm -> selectionModelInstance
      //record -> Index
      alert(record.data); //Error
      //record is actually Index here, and it obviosly doesn't have data property.
    }
    

    您看到的错误与调用函数时的参数不匹配无关。 Javascript 允许使用任意数量的参数调用任何带有任意数量参数的函数。该错误与尝试取消引用不存在的属性 record.data 有关。

    要回答您的问题,您必须使用 API 指定的签名定义回调函数,只是为了正确映射参数。

    【讨论】:

    • 是的...这是一个特定于事件的函数,您必须按确切的顺序传递3个参数,否则会抛出错误!在这种情况下,函数与 rowSelect 公共事件“链接”。谢谢!
    • 只是为了澄清前面的评论,如果您实际使用第三个参数,则必须仅传递所有 3 个参数。它不会因为您遗漏了参数而引发错误——当您尝试访问空引用时它会引发错误。您只需要指定您实际要在函数中使用的最后一个参数——之后的所有其他参数都可以省略。这通常适用于函数,而不仅仅是事件处理程序。
    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    相关资源
    最近更新 更多