我已经将动态内容控件与动态页面公式一起使用了一些,但它总是在页面加载时计算并且没有改变。我一直在进行一项测试,我想根据组合框和 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>
 
<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/