我有一个使用 ExtJS 框架构建的网络应用程序。
我的西面板有一棵树,中间面板有一个 TabPanel。当我单击西面板中树上的任何节点时,它会尝试在中心 TabPanel 上添加一个表单,调用以下代码:
var center = Ext.getCmp("center-panel");
var existingpanel = center.get(panelId);
if (existingpanel) {
center.setActiveTab(existingpanel);
} else {
var activeTab = center.getActiveTab();
if (!openNew && activeTab) {
var removed = center.remove(activeTab, true);
}
center.add(c);
center.setActiveTab(panelId);
center.doLayout();
}
这将检索当前组件,然后检查我们尝试加载的选项卡是否存在,如果确实存在则它只是激活该选项卡,否则它将尝试添加一个新选项卡。OpenNew 只是一个标志,用于说明是否应在新选项卡中打开它(例如,如果用户 ctrl+单击树上的节点)。
在不使用 OpenNew 功能(例如,只有一个选项卡)的情况下,表单可以正常工作,并且我可以在节点之间导航,并且可以正确删除/重新添加选项卡。
但是,如果我 ctrl+单击一个节点以打开第二个选项卡,该选项卡首先打开,所以有两个选项卡,但是当我选择另一个节点时(所以这应该只是删除最近添加的第二个选项卡并将其替换为新节点的新选项卡)它只是关闭第二个选项卡但无法添加新选项卡。
我看不出它背后的任何原因,因为当只有一个选项卡时,它会添加/删除选项卡。
FireBug 中有一个错误,但它没有提供太多帮助:
uncaught exception: [Exception... "Could not convert JavaScript argument arg 0 [nsIDOM3Node.compareDocumentPosition]" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: /ext/ext-3.1.1/adapter/ext/ext-base-debug.js?d=1066331810 :: <TOP_LEVEL> :: line 1900" data: no]
------------更新: --------------
它似乎与 doLayout() 调用相关 - 如果我在 remove() 调用之后直接调用 doLayout() ,那么它不会像 add() 调用那样胖,如果我把它放在 .add() 之后调用然后它一半加载新选项卡,但在完成之前停止。
如果我在两者之后都有一个 doLayout() 调用,那么它的效果会好一些,然后我可以有两个正常工作的选项卡,但是当我尝试添加第三个选项卡时,它会显示与上面相同的行为,并关闭第三个选项卡并不会重新开一个新的。。