xpages - 如何让动态内容控件刷新 onChange?

标签 xpages xpages-extlib

我已经将动态内容控件与动态页面公式一起使用了一些,但它总是在页面加载时计算并且没有改变。我一直在进行一项测试,我想根据组合框和 onChange 事件选择要显示的页面。我已经完成了完全刷新以及几个不同的部分刷新,但页面似乎只在页面加载时计算。这个调用的页面只显示“第一页”“第二页”等。 打印语句仅从初始页面加载开始打印。我已经对“customeControlInclude”“dynamicContentView”进行了部分刷新,并在组合框的 onChange 事件中进行了完整更新,但这些都不会导致 dynamicControlView 更改加载的页面。

所以我的问题是“有没有办法让动态内容控件重新计算并显示适当的页面?

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom"
    xmlns:xe="http://www.ibm.com/xsp/coreex">
    <xp:this.resources>
        <xp:script src="/js Utils.jss" clientSide="false"></xp:script>
    </xp:this.resources>
    <xp:panel id="thisPage">

        <xp:text escape="true" id="computedField1" value="#{sessionScope.ssSelectedView}"></xp:text>
        &#160;
        <xp:br></xp:br>
        <xp:br></xp:br>

        <xp:comboBox id="comboBox1" value="#{sessionScope.ssSelectedView}"
            style="width:20%">
            <xp:selectItem itemLabel="Test One"></xp:selectItem>
            <xp:selectItem itemLabel="Test Two"></xp:selectItem>
            <xp:selectItem itemLabel="Test Three"></xp:selectItem>
            <xp:selectItem itemLabel="Test Four">
            </xp:selectItem>


            <xp:eventHandler event="onchange" submit="true"
                refreshMode="partial" refreshId="thisPage">
            </xp:eventHandler>
        </xp:comboBox>
        <xp:br></xp:br>
        <xp:panel id="panelView">
            <xp:table>
                <xp:tr>
                    <xp:td style="width:100.0%" valign="top">
                        <xe:dynamicContent id="dynamicContentView">
                            <xp:include id="customControlIncluder">
                                <xp:this.pageName>
                                    <![CDATA[${javascript:try{
    var debug:Boolean = true;
    if (debug) print("Select Page in xpMainInput.xsp");
    var viewName:String = sessionScope.ssSelectedView;
    var page:String = null;
    switch(viewName){
        case "test One" :
            page = "ccTestOne.xsp";
            break;
        case "Test Two" :
            page = "ccTestTwo.xsp";
            break;
        case "Test Three" :
            page = "ccTestThree.xsp";
            break;
        case "Test Four" :
            page = "ccTestFour.xsp";
            break
        //Add additional case statements for each additional Application
    }
    if (page == null){
        if (debug) print("Error in Main page is null ");
        return "ccTestOne.xsp";
    }else{
        if (debug) print("xpMain page = " + page)
        return page;
    }
}catch(e){
    print("Error Define Page in xpMain.xsp " + e.string());
}}]]>
                                </xp:this.pageName>
                            </xp:include>
                        </xe:dynamicContent>
                    </xp:td>

                </xp:tr>
            </xp:table>
        </xp:panel>
    </xp:panel>
</xp:view>

最佳答案

如果您重定向到同一页面而不是完全或部分刷新,并且之前将所需的自定义控件名称写入 session 范围变量,则可以动态加载不同的自定义控件。

那么您的测试 XPage 可能如下所示:

    <xp:comboBox id="comboBox1" value="#{sessionScope.ssSelectedView}"
        style="width:20%">
        <xp:selectItem itemLabel="Test One" itemValue="ccTestOne.xsp"></xp:selectItem>
        <xp:selectItem itemLabel="Test Two" itemValue="ccTestTwo.xsp"></xp:selectItem>
        <xp:selectItem itemLabel="Test Three" itemValue="ccTestThree.xsp"></xp:selectItem>
        <xp:selectItem itemLabel="Test Four" itemValue="ccTestFour.xsp"></xp:selectItem>

        <xp:eventHandler event="onchange" submit="true"
            refreshMode="norefresh">
            <xp:this.action><![CDATA[#{javascript:
                facesContext.getExternalContext().redirect(context.getUrl().toString())
            }]]></xp:this.action>
        </xp:eventHandler>
    </xp:comboBox>

    <xp:br></xp:br>

    <xp:panel id="panelView">
        <xp:table>
            <xp:tr>
                <xp:td style="width:100.0%" valign="top">
                    <xp:include id="customControlIncluder">
                        <xp:this.pageName>
                            <![CDATA[${javascript:
                                !sessionScope.ssSelectedView ? "ccTestOne.xsp" : sessionScope.ssSelectedView
                            }]]>
                        </xp:this.pageName>
                    </xp:include>
                </xp:td>
            </xp:tr>
        </xp:table>
    </xp:panel>

作为替代方案,您可以使用带选项 repeatControls="true" 的重复控件将所有自定义控件添加到 XPage,并根据范围变量一次仅呈现一个自定义控件。这适用于部分刷新。

    <xp:comboBox id="comboBox1" value="#{sessionScope.ssSelectedView}"
        style="width:20%">
        <xp:selectItem itemLabel="Test One" itemValue="ccTestOne.xsp"></xp:selectItem>
        <xp:selectItem itemLabel="Test Two" itemValue="ccTestTwo.xsp"></xp:selectItem>
        <xp:selectItem itemLabel="Test Three" itemValue="ccTestThree.xsp"></xp:selectItem>
        <xp:selectItem itemLabel="Test Four" itemValue="ccTestFour.xsp"></xp:selectItem>

        <xp:eventHandler event="onchange" submit="true"
            refreshMode="partial" refreshId="repeatCc">
        </xp:eventHandler>
    </xp:comboBox>

    <xp:br></xp:br>

    <xp:panel id="panelView">
        <xp:table>
            <xp:tr>
                <xp:td style="width:100.0%" valign="top">
                    <xp:repeat
                        id="repeatCc"
                        rows="100"
                        repeatControls="true"
                        var="cc"
                        value="#{javascript:['ccTestOne.xsp','ccTestTwo.xsp','ccTestThree.xsp','ccTestFour.xsp']}">
                        <xp:include
                             pageName="${cc}"
                             rendered="#{javascript: !sessionScope.ssSelectedView ? (cc === 'ccTestOne.xsp') : (cc === sessionScope.ssSelectedView)}" />
                    </xp:repeat>
                </xp:td>
            </xp:tr>
        </xp:table>
    </xp:panel>

关于xpages - 如何让动态内容控件刷新 onChange?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28519591/

相关文章:

xpages - 文本框的自定义转换器

html - 多行编辑框值转换为 HTML,以便通过 xpages 中的电子邮件发送

datetime - XPage 中存储的时间不一致

xpages - ExtLibUtil 文档 - 在哪里可以找到可用的函数?

css - 用Bootstrap打印富文本,BR元素被IE完全忽略

java - Xpages ExtLibUtil.getCurrentSessionAsSigner() 返回 null

javascript - Div 内容的 onClick 事件

java - XPAGES : how have two faces-config which inherited one by one and the second keeps his specificities?