我认为这是标签容器中的错误......
当新选项卡包含一个面板设置为指向同一数据库中另一个XPage的iframe时,使用Java或Server Side JavaScript createTab方法打开一个新选项卡将导致XPage在加载大约五个后重新加载或六个选项卡(在Chrome中,IE执行相同但需要更多选项卡...)
如果选项卡包含指向另一个包含XPage的数据库的iframe,则可以正常工作。
SSJS代码是:
getComponent("djTabContainer1").createTab({title:"New tab"});
;
Java代码是
public static boolean createTab(UIDojoTabContainer tabContainer) {
try {
if (tabContainer == null) {
tabContainer = (UIDojoTabContainer) Utils.findComponent("TabContainer");
if (tabContainer == null) {
return false;
}
}
String tabTitle = null;
String url = null;
String unid = null;
UIDojoTabPane newTab = null;
// get default number from current project preferences
tabTitle = "My Tabpage";
url = Utils.GetXpageURL("tabpage.xsp");
// create a new Tab
newTab = new UIDojoTabPane();
newTab.setTitle(tabTitle);
newTab.setTabUniqueKey(new Random().toString());
newTab.setClosable(true);
newTab.setId("TabContainer_" + unid);
newTab.setStyleClass("myTabContainer");
Utils.WriteToConsole("setting style class on " + newTab.getTitle());
// newTab.setStyle("height:auto;width:auto; overflow-y: auto;border: 0px;");
// create new Panel
UIPanelEx newPanel = new UIPanelEx();
newPanel.setId("IFrame" + unid);
newPanel.setStyleClass("iframeClass");
// make an iFrame of this panel with our URL as src
newPanel.setTagName("iframe");
Attr property = new Attr();
property.setName("src");
property.setValue(url);
newPanel.addAttr(property);
// add Panel to our new Tab
newTab.getChildren().add(newPanel);
// add the new tab to our tab container
tabContainer.getChildren().add(newTab);
tabContainer.setSelectedTab(unid);
return true;
} catch (Exception ex) {
Utils.WriteToConsole("Unable to add a new Tab Page to the Tab Container (com.tlcc.Main.createTab)", ex);
return false;
}
}
iframe的src属性中引用的XPage非常基本...
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:button
value="Label"
id="button1">
</xp:button>
<xp:inputText id="inputText1"></xp:inputText></xp:view>
当XPage重新加载时,它没有更多选项卡(除了在开始时在XPage中创建的第一个选项卡),并且没有响应。
霍华德
答案 0 :(得分:4)
它可能是服务器页面持久性/组件树限制问题。如果使用默认服务器页面持久性,则服务器仅在内存中存储4个页面(每个用户)。
当您在加载另一个XPage的页面上创建新选项卡时,服务器正在填充服务器页面持久性队列,当您点击第5个选项卡时,当前页面不再是服务器页面持久性的一部分(组件树)不再在内存中导致重新加载当前页面。
您可以增加存储的页数(并且还可以移动磁盘持久性而不是内存持久性)。您还可以在iframe中加载的XPage上将viewState设置为“nostate”(至少测试我的理论)。
请参阅Toby Samples blog post on state以及类似州问题的答案:https://stackoverflow.com/a/31431917/785061
答案 1 :(得分:0)
因此,要完成此操作... viewstate = nostate的设置允许更多选项卡,但不会将组件保留在内存中。因此,它适用于只读XPage,但不适用于XPage上的文档处于编辑模式。在持久性选项卡上的Xsp属性中设置磁盘上的最大页数将允许使用具有XPage但仍会在某些时候崩溃的iframe的更多选项卡。
Net是,不要使用多个iframe来从同一个nsf中提取XPage ...