我有一个使用ExtJS框架构建的Web应用程序。
我的西面板上有一棵树,中间面板上有一个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()调用,那么它会更好一点,然后我可以有两个功能选项卡,但是当我尝试添加第三个选项卡时,它会显示与上面相同的行为,并关闭第三个标签,并没有重新打开一个..
答案 0 :(得分:1)
我现在已经解决了这个问题 - 问题与我实际添加的formPanel有关,而所有面板本身都有唯一的ID,我没想过检查表单中其他组件的ID(正如Jad所建议的那样)他的评论),表格中有“FieldSets”定义了静态ID,删除那些解决了问题。
我还使用开发人员工具在Chrome中测试了这个问题,发现堆栈跟踪提供的功能比FireBug提供的错误更有用,所以从现在开始我将使用这两个错误!