这是之前发布的后续内容。我能够把它分离到尽可能简单的情况。 在我正在处理的应用程序中,我希望根据applicationScope变量的值进行条件局部刷新,该变量可能会在用户打开文档时更改。我无法使它工作,因为看起来partialRefresh目标仅在调用partialRefresh时不动态地在pageLoad事件上进行评估。为了证明这一点,我创建了一个小测试XPage,可以在没有更新的情况下切换True和False之间的viewScope变量。然后是一个具有partialRefresh公式的按钮,该公式指定是刷新panelTrue还是panelFalse。默认情况下,首次打开文档时,它会刷新并显示panelFalse,因为vsIsTrue为null并解释为False。如果我将vsISTrue切换为True然后单击Partial刷新按钮,您将看到panelFalse是刷新的面板,而不是panelTrue。我将注释放在部分刷新的公式中,部分刷新公式在每次刷新时执行并返回正确的过程,但是它永远不会将面板更改为实际刷新到panelTrue。
所以我想我的问题是 - 有不同的方法可以完成吗?因为我看不出怎么样。我已经包含了下面的源代码 - 请注意我使用了调试工具栏,因此您可能需要删除dbBar引用。:
<?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">
<xc:ccDebugToolbar defaultCollapsed="false" collapseTo="left"></xc:ccDebugToolbar>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:button id="SetViewScope" value="Toggle View Scope">
<xp:eventHandler event="onclick" submit="true" refreshMode="norefresh">
<xp:this.action><![CDATA[#{javascript:(viewScope.get("vsIsTrue")) ? viewScope.put("vsIsTrue",false) : viewScope.put("vsIsTrue",true)}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
<xp:button value="Partial Refresh" id="PartialRefresh">
<xp:eventHandler event="onclick" submit="true" refreshMode="partial"
refreshId='#{javascript:if (viewScope.get("vsIsTrue")){
dBar.info("Refesh panelTrue");
return "panelTrue";
break;
}else {
dBar.info("Refresh panelFalse");
return "panelFalse";
break;
}}'>
</xp:eventHandler>
</xp:button>
<xp:panel id="panelTrue">
This is panelTrue - viewScope(vsIsTrue) =
<xp:text escape="true" id="computedField1" value="#{viewScope.vsIsTrue}"></xp:text>
</xp:panel>
<xp:panel id="panelFalse">
This is panelFalse - viewScope(vsIsTrue;) =
<xp:text escape="true" id="computedField2" value="#{viewScope.vsIsTrue}"></xp:text>
</xp:panel>
</xp:view>
答案 0 :(得分:5)
要执行此操作,您必须更新客户端中的数据。如果更改按钮的代码,则应解决问题:
<xp:button id="SetViewScope" value="Toggle View Scope">
<xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="PartialRefresh">
<xp:this.action>
<![CDATA[#{javascript:(viewScope.get("vsIsTrue")) ? viewScope.put("vsIsTrue",false) : viewScope.put("vsIsTrue",true)}]]>
</xp:this.action>
</xp:eventHandler>
</xp:button>
如您所见,事件处理程序现在更新ID为 PartialRefresh 的按钮( refreshMode 设置为 partial )。单击切换视图范围时,将使用最新代码重新加载CSJS DOM元素。下次单击按钮并触发部分刷新时,客户端会将正确的ID发送到服务器。
修改强>
另一种方法是使用CSJS脚本块执行相同的技巧:
<xp:div id="refreshMe">
<xp:scriptBlock id="scriptBlockRefresh">
<xp:this.value>
<![CDATA[
var idPanelTrue = '#{id:panelTrue}';
var idPanelFalse = '#{id:panelFalse}';
var vsIsTrue = #{javascript:viewScope.get('vsIsTrue')};
XSP.allowSubmit();
var id = vsIsTrue?idPanelTrue:idPanelFalse;
XSP.partialRefreshPost(id,{});
]]>
</xp:this.value>
</xp:scriptBlock>
</xp:div>
不是刷新元素,而是刷新CSJS sciptblock,然后更新正确的XPage元素。在这种情况下,部分刷新按钮必须如下所示:
<xp:button value="Partial Refresh" id="PartialRefresh">
<xp:eventHandler event="onclick" submit="true" refreshMode="partial"
refreshId='refreshMe'>
</xp:eventHandler>
</xp:button>