XPage可以有多种渲染条件

时间:2014-06-18 15:53:16

标签: javascript xpages

我有一个带有djTabContainer的Xpage,并且tab容器包含多个自定义控件。其中一个自定义控件仅在满足某个条件时呈现内容,如此处所示;

<xp:this.rendered><![CDATA[#{javascript:getComponent("conCapRev").getValue()   
== "External”}]]></xp:this.rendered>

我希望在满足以下两个条件之一时呈现自定义控件内容,其中渲染标记基本上具有或在Javascript中。如果这不可能,那么可以有两个渲染标签吗?

我应该提一下,选项卡式自定义控件的渲染(或不渲染)应该在创建文档时发生,而不是在创建和保存文档之后。

上面的代码适用于此方案。当我为document1更改getComponent时,如下一个XML标记所示,它也可以正常工作。

<xp:this.rendered><![CDATA[#{javascript:document1.getValue("conCapRev")   
== "External"}]]></xp:this.rendered>

但是当我添加第二个条件时,如下所示它不起作用,并且始终呈现自定义控件。我该怎么解决这个问题呢?

<xp:this.rendered><![CDATA[#{javascript:document1.getValue("conCapRev") == "External" 
|| document1.getValue("conTenderType") != "Extension"}]]></xp:this.rendered>

或许添加更多信息以使问题更加清晰 - 在“合同”文档启动期间,用户决定conCapRev字段是“内部”还是“外部”,然后继续用户选择的合同一般信息来自可能列表的招标类型(ConTenderType字段)的值,其中一个是“扩展”。然后,用户至少完成包含许多字段的“工作流程”选项卡,此时可以保存或退出合同(丢弃而不保存)。在保存合同之前或之后,用户可以转到另一个名为Baseline的选项卡,如果conCapRev字段为“外部”或conTenderType字段为“Extension”,则不会呈现该选项卡。

2 个答案:

答案 0 :(得分:0)

你当然可以做你想做的事。如果这两个组件实际上绑定到数据源字段,那么您应该向数据源询问值而不是组件。

所以请尝试这样做(假设您的数据源名为“document”):

<xp:this.rendered><![CDATA[#{javascript:
document.getValue("conCapRev") == "External" 
|| document.getValue("conTenderType") != "Extension"
}]]></xp:this.rendered>

答案 1 :(得分:0)

您在上一个问题的句子中说您想要基线自定义控制

NOT be rendered if 
the conCapRev field is "External" OR 
the conTenderType field is "Extension"

或者说另一种方式

be rendered if 
the conCapRev field is NOT "External" AND 
the conTenderType field is NOT "Extension"

那么,你的渲染条件应该是

<xp:this.rendered><![CDATA[#{javascript:
    document1.getValue("conCapRev") != "External" &&
    document1.getValue("conTenderType") != "Extension"
}]]></xp:this.rendered>

在评论后更新:

更改conTenderType的值后,您必须部分刷新

  • conTenderType&#39; listBox
  • ContractBaselinePanel面板
  • ContractDetailPanel面板

您可以使用级联CSJS XSP调用来执行此操作。确保您没有尝试刷新具有呈现属性的元素,就好像它没有呈现它不能刷新(因为它不在客户端)。

<xp:listBox
    id="listBoxConTenderType"
    value="#{document1.conTenderType}">
    <xp:selectItem
        itemLabel="Extension">
    </xp:selectItem>
    <xp:selectItem
        itemLabel="...">
    </xp:selectItem>
    <xp:eventHandler
        event="onchange"
        submit="false">
        <xp:this.script><![CDATA[
           XSP.partialRefreshPost("#{id:listBoxConTenderType}", {
               onComplete: function() {
                   XSP.partialRefreshGet("#{id:ContractBaselinePanel}", {
                      onComplete: function() {
                          XSP.partialRefreshGet("#{id:ContractDetailPanel}", {});
                      } 
                   });
              }
           });]]></xp:this.script>
    </xp:eventHandler>
</xp:listBox>
<xp:panel
    id="ContractBaselinePanel">
    <xp:panel>
        <xp:this.rendered><![CDATA[#{javascript:
            document1.getValue("conCapRev") != "External" &&
            document1.getValue("conTenderType") != "Extension"
        }]]></xp:this.rendered>
        ...your Baseline Custom Control...
    </xp:panel>
</xp:panel>