这是标签容器中的错误吗?

时间:2015-07-21 18:24:11

标签: xpages xpages-extlib

我认为这是标签容器中的错误......

当新选项卡包含一个面板设置为指向同一数据库中另一个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中创建的第一个选项卡),并且没有响应。

霍华德

2 个答案:

答案 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 ...