ExtJS:第二个模态窗口导致错误:未捕获TypeError:无法读取null的属性'addCls'

raj*_*adu 2 extjs extjs4.1

我收到错误:"Uncaught TypeError:无法读取属性'addCls'的null"在以下方案中.

我需要两个模态窗口.第一个模态窗口有一个Grid.当我在第一个模态窗口中双击网格时,我应该打开第二个模态窗口.以下是我使用的代码:

  saleOrderEmployeeGrid.on('celldblclick', function(tableview, td, cellIndex, record, tr, rowIndex, e, eOpts){
    loadActivityWindow();
  });
  }

  function loadActivityWindow()
  {
        jobSlotActivityWin = new Ext.Window({
        id          :'jobSlotActivityWinId',
        modal       : true,
        layout      : 'fit',
        width       : 900,
        height      : 500,
        closeAction :'destroy',
        plain       : true,
        model       : true,
        stateful    : false,
        title       :'Create Job Slot',
        items       : [soActivityPanel],
        buttons     : [{
            text        : 'Close',
            handler     : function(){
                            jobSlotActivityWin.destroy();
                        }
            }
        ] 
        });
        jobSlotActivityWin.show();
        Ext.WindowManager.register (createJobSlotWin); // createJobSlotWin is the first modal window
        Ext.WindowManager.register(jobSlotActivityWin); // jobSlotActivityWin is the second modal window created above
        Ext.WindowManager.bringToFront ('jobSlotActivityWinId');
  }
Run Code Online (Sandbox Code Playgroud)

所以,当我双击saleOrderEmployeeGrid时,我看到第二个模态窗口很好.然后我关闭第二个模态窗口并在第一个模态窗口上再次双击网格.

这现在没有调出第二个模态窗口.它在第一个模态窗口的背景中完全被掩盖并且空白,我在JavaScript控制台中看到以下错误:未捕获TypeError:无法读取null的属性'addCls'

更准确地说,错误似乎来自jobSlotActivityWin.show(),因为我的调试日志在那时失败了.

以前有人面对这个并且可以帮助我吗?

pll*_*lee 8

将closeAction设置为隐藏,不确定为什么默认值是destroy,但它本质上意味着当窗口关闭时元素将从dom中删除而show不再起作用.

http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.panel.Panel-cfg-closeAction

回复评论:

条件创建示例

//the window is only created once, the data is always show and updated.

if(!this.win) {
    this.win = createWindow();
}

updateWindowData();
this.win.show();
Run Code Online (Sandbox Code Playgroud)

而不是说closeAction:'hide'到处都是,我们的源代码中有这样的东西

Ext.override(Ext.Window, {
    closeAction: 'hide'
})
Run Code Online (Sandbox Code Playgroud)

如果您在创建任何窗口之前放置该片段,则默认情况下所有窗口都将为closeAction hide.

  • @rajugaadu是的,它不起作用,因为你的处理程序直接调用`destroy`.它应该叫做'close`而不是.全局,硬编码的id和盲目创建而不检查窗口是否存在是不好的.具有相同id的"新窗口,新窗口"将抛出我认为的错误. (2认同)
  • @rajugaadu所有Windows都要设置closeAction来隐藏,默认是destroy.该窗口应仅创建一次,但每次都应更新数据.我将添加一个额外的代码片段来显示我正在谈论的内容.让实例保持活力并不比在客户端上可以完成的任何事情更具风险.这是首选方式,效率更高. (2认同)