我已经将动态内容控件与动态页面公式一起使用,但它总是在页面加载时计算而不是更改。我一直在进行测试,我想根据组合框和onChange事件选择要显示的页面。我已经完成了一次完全刷新以及几个不同的部分刷新,但看起来该页面仅在页面加载时计算。这个调用的页面不做任何事情,只显示“Page One”“Page 2”等。 打印语句仅从初始页面加载打印。我已经部分刷新了“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>
答案 0 :(得分:2)
如果您redirect
到同一页面而不是完全或部分刷新,则可以动态加载不同的自定义控件,并在之前将所需的自定义控件名称写入会话范围变量。
您的测试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>
答案 1 :(得分:0)
如上所述,pageName的值只能在页面加载时解析。我已经使用这段代码动态地定义了要在几个地方加载的页面,但它们一直在加载新的XPage时所以它一直工作正常。在上面的代码中,我试图强制在部分刷新时重新计算pageName。我甚至尝试了完整更新,但不会重新计算pageName。希望它会......但是......: - )