6

我的 extjs 应用程序中有一个组合,我想显示“你确定吗?” 如果用户拒绝,则向用户确认窗口并防止更改。

由于 JavaScript 的确认框是同步的,因此可以正常工作。但是使用 Ext JS,会显示确认消息,并且我的其余代码将在用户响应之前执行。这是我的代码:

// JavaScript confirm box
{
    xtype: 'combo',
    ...
    ...
    ...
    listeners: {
        beforeselect: function(combo, record, index ) {
            if(confirm('Are you sure ?') == false)
            {
                 return false; // prevent combo from changing
            }
            // else continue
        }
    }
}
// Ext JS message box (to confirm)
{
    xtype: 'combo',
    ...
    ...
    ...
    listeners: {
        beforeselect: function(combo, record, index ) {
            Ext.Msg.show({
                title: 'Warning',
                msg: 'Are You Sure ?',
                buttons: Ext.Msg.YESNO,
                fn: function(btn) {
                    if (btn == 'yes') {
                        // continue and set new value on combo
                    }
                    else if (btn == 'no') {
                        // prevent combo from changing
                    }
                }
            });
        }
    }
}

问题是Ext.Msg.show获取回调函数并且不等待用户回答并且我们无法阻止组合框更改。

我应该怎么办?

4

1 回答 1

10

为了取消组合框更改,beforeSelect侦听器需要返回 false。我的建议是:

beforeselect: function(combo, record, index ) {
  Ext.Msg.show({
    title: 'Warning',
    msg: 'Are You Sure ?',
    buttons: Ext.Msg.YESNO,
    fn: function(btn) {
      if (btn == 'yes') {

        // Here we have to manually set the combo value
        // since the original select event was cancelled
        combo.setValue( /* whatever value was selected */ );
      }

      else if (btn == 'no') {

        // Don't do anything because the select event was already cancelled
      }
    }
  });

  // Cancel the default action
  return false;
}

ExtJS 模态不会像本机对话框那样停止脚本的执行,这意味着beforeSelect侦听器在用户操作之前返回。此代码的工作方式是立即停止选择事件,并显示对话框。当用户选择“是”时,组合上的值会以编程方式在回调函数中设置。

于 2013-03-02T21:28:35.473 回答