2014-03-01 52 views
0

这是之前发布的后续操作。我能够将它隔离到尽可能简单的情况。 在我正在处理的应用程序中,我想根据在用户打开文档时可能会更改的applicationScope变量的值执行条件部分刷新。我无法得到它的工作,因为看起来partialRefresh目标只在pageLoad事件上被评估,而不是在调用partialRefresh时动态地评估。为了演示这一点,我创建了一个小测试XPage,在True和False之间切换viewScope变量,而不更新。然后是一个具有partialRefresh公式的按钮,该公式指定是否刷新panelTrue或panelFalse。默认情况下,当文档第一次打开时,它会刷新并显示panelFalse,因为vsIsTrue为null并被解释为False。如果我将vsISTrue切换为True,然后单击部分刷新按钮,您将看到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

只是要清楚,你想防止在一定条件下刷新,还是你想改变*其*内容被刷新?在你之前的问题上,你的目标看起来像是前者,但在这个问题上你似乎在尝试后者。 –

+0

ExtLib是一个选项吗?开关组件应该有帮助。 –

+0

@Tim - 我想改变目标。范围变量发生变化时。它实际上会更像是如果vsIsTrue = true,然后进行部分刷新,否则不会做任何更新。 –

回答

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> 

正如你所看到的,事件处理程序与PartialRefresh(在refreshMode设置为部分的ID现在更新按钮)。当点击切换视图范围时,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> 
+0

谢谢我喜欢第二个选项,它看起来会完成这项工作。 真的很感谢帮助和分享的意愿。 –

+0

工程就像一个魅力,非常感谢你! –