【问题标题】:Ext.Msg.confirm callback is not creating a closureExt.Msg.confirm 回调未创建闭包
【发布时间】:2012-10-11 14:03:46
【问题描述】:

例子:

disclose: function (list, record, node, index, event) {
    Ext.Msg.confirm('Delete Requirement', 'Are you sure?', function (id, value) {
        if (id === 'yes') {
            console.log('confirmed');

            // no access to list, record, node, ... here, why?
        }
    }, this);

    event.stopEvent();
}

如何访问确认消息处理程序中的列表和记录变量?

【问题讨论】:

  • 确实可以访问那里的listrecord。你看到了什么让它看起来不像?
  • console.log(list); 是做什么的然后返回?
  • 您确定要绑定到“披露”的事件实际上提供(列表、记录)等作为参数吗?
  • 当然,公开确实包括列表、记录等参数。但在回调内部,它们是未定义的,Web Inspector 不会在本地范围内显示它们。
  • @Vitaly 很奇怪。看看this jsfiddle,它似乎和你正在做的一样,但是回调可以访问listrecord等就好了。

标签: extjs callback sencha-touch closures sencha-touch-2


【解决方案1】:
disclose: function (list, record, node, index, event) {
    var l = list, r = record, n = node, i = index, e = event;
    Ext.Msg.confirm('Delete Requirement', 'Are you sure?', function (id, value) {
            if (id === 'yes') {
            console.log('confirmed', l, r, n, i, e);
        }
    }, this);

    event.stopEvent();
}

【讨论】:

  • 行得通!不过,我想知道为什么?为什么闭包看不到父函数参数但会看到它的局部变量?这些本质上不一样吗?
  • 我不确定,但我认为这是因为函数的变量实际上是arguments[0]..arguments[n]。所以里面嵌套的回调arguments已经不一样了。
【解决方案2】:

我找到了解决办法:

disclose: function (list, record, node, index, event) {
    (new Ext.MessageBox).show({
         title: 'Delete Requirement',
         message: 'Are you sure?',
         list: list,
         record: record,
         buttons: Ext.MessageBox.YESNO,
         promptConfig: false,
         fn: function (id, value, opt) {
             if (id === 'yes') {
                 opt.record.destroy();
             }
         }
    });

    event.stopEvent();
}

【讨论】:

    猜你喜欢
    • 2014-09-13
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 2016-04-06
    • 2017-03-07
    • 2019-11-06
    相关资源
    最近更新 更多