xpages基于组合框值隐藏/显示字段

xpages基于组合框值隐藏/显示字段,xpages,xpages-ssjs,Xpages,Xpages Ssjs,我使用的有10个包含许多字段组件 有一个主要的组合框,它的值将决定要显示或不显示哪些字段,并以这种方式实现文档结构 如果我将使用这种方法,那么对于我想要显示/隐藏的所有>50字段,我将只使用组合框的onChange事件 考虑到有>50个字段进入该类别,我是否应该使用另一种方法/方法?谢谢你抽出时间 <xp:comboBox value="#{Contr.txt_tipcontractcv}" id="comboBox4">

我使用的
有10个
包含许多字段组件

有一个主要的组合框,它的值将决定要显示或不显示哪些字段,并以这种方式实现文档结构

如果我将使用这种方法,那么对于我想要显示/隐藏的所有>50字段,我将只使用组合框的
onChange
事件

考虑到有>50个字段进入该类别,我是否应该使用另一种方法/方法?谢谢你抽出时间

<xp:comboBox value="#{Contr.txt_tipcontractcv}" id="comboBox4">                                 <xp:selectItems id="selectItems1">                                      
     <xp:this.value><![CDATA[#{javascript:return ""}]]></xp:this.value>
</xp:selectItems>
<xp:selectItems id="selectItems2">
    <xp:this.value><![CDATA[#{javascript:@DbColumn(@DbName(),"SetupvwTipuriContracteC",1);}]]>           </xp:this.value>
</xp:selectItems>                   
<xp:eventHandler event="onchange" submit="false">                                       <xp:this.script><![CDATA[XSP.partialRefreshPost("#{id:FisaP}", {
});
]]></xp:this.script>                                    </xp:eventHandler>                          </xp:comboBox>

小组:

<xp:panel id="FisaP">
        <xp:label id="label4"
            style="color:rgb(128,0,0);font-family:verdana;font-size:9pt;font-weight:bold">
            <xp:this.value><![CDATA[#{javascript:"Fisa contract "+ Contr.getItemValueString("txt_tipcontractcv")}]]></xp:this.value>
            <xp:this.rendered><![CDATA[#{javascript:
            Contr.getItemValueString("txt_tipcontractcv") != ""
         }]]></xp:this.rendered>

        </xp:label>

    </xp:panel>

我会扭转局面。让标签和字段询问组合框是否应该呈现它们。让组合框的onchange事件启动面板的部分刷新,该面板包含所有要显示/隐藏的字段

如果>50个字段都位于一个位置,则可以使用面板对其进行框显,并在其中设置渲染属性

如果组合框绑定到viewScope变量,则字段/标签的呈现属性将为

rendered=“#{javascript:viewScope.tipcontractcv1=='Vanzare Cumparare'}”
或者,如果它绑定到文档字段,则

rendered=“#{javascript:document1.getItemValueString('txt_-tipcontractcv1')=='Vanzare-Cumparare'}”
更新:

根据答案中的代码,执行以下步骤,使其与Dojo选项卡容器一起工作:

一,

将标签和字段放在面板中,这些面板确实有id,但没有渲染属性


... 其他标签和字段。。。
您可以创建其他面板“panel2”、“panel3”。。。也它们可以放置在不同的选项卡窗格中

二,

更改组合框的
onchange
事件,并执行客户端代码以刷新面板


三,

如果将具有相同渲染属性的标签和字段放在一个附加面板中,则可以优化代码


... 其他标签和字段。。。

首先。。。永远不要这样做:

if (comboVal == "Vanzare-Cumparare") 

即使它被称为“SSJS”。。它真的不是“JavaScript”。。。您基本上是在使用Java。在Java中,一切都是对象。甚至是一个文本字符串。因此,输入“Vanzare Cumparare”几乎就是在创建一个新对象。您可以在SSJS编辑器前面的typeahead中看到这一点。试着输入“任何东西” 我看到了一个真正的问题。如果当前未呈现组件,则无法使用getComponent获取该组件的句柄。如果仅更改显示值,则即使未显示零部件,零部件也始终存在

大概是这样的:

var combo:javax.faces.component.UIComponent = getComponent("txt_tipcontractcv1");
var comboVal = combo.getValue(); 
if (comboVal.equalsIgnoreCase("Vanzare-Cumparare")) {
    document.getElementById("#{id:label2}").style.display = "block"; // or "inline"
} else {
    document.getElementById("#{id:label2}").style.display = "none";
}

您需要确保始终呈现label2元素,以便样式指示它是否可见。

可能是,您可以检查combo.getSubmittedValue()是否将返回值。@FrankVanderInden我尝试使用:var comboVal=combo.getSubmittedValue(),但我仍然没有工作。如果你打印(comboVal),可能会给它一个问题的线索。我补充道:。但是我想我需要对相应的字段进行部分刷新。你能给我举个例子说明如何部分刷新,比如说,4个字段吗?不幸的是,考虑到我的字段不在同一个面板上,而是在不同的DjTabPane上,下面很好地描述了如何部分刷新多个id:;我收到一个错误:没有要提交的元素,id视图:_id1:_id2:_id50:djContentPane1:djTabPane1:label2(id为label2)我现在看到了。假设我的容器中有4个标签。我可以在每个选项卡中只定义一个面板,在这个面板上有两种类型的字段:哪些字段将被隐藏或不隐藏(对于那些我想隐藏的字段,我只添加属性)。这样,我只刷新4个ID:panel[I],I=1..4。因此,面板将刷新,具有呈现属性的字段将从此隐藏,其他字段不会,对吗?我将结合回答:a)使用绑定而不是UI元素来决定呈现(毕竟呈现不是基于UI决策,而是基于业务决策,因此模型应该驱动它)b)使用.equalIgnoreCase c)部分刷新d)xp:panels或xp:div中的组字段,以最大限度地减少需要对响应进行跟踪的呈现评估的数量。在客户端运行,“document”将重新引用xpage的数据源?不,document实际上是简单javascript中的window.document。根本没有对数据源的引用。
if (comboVal.equalsIgnoreCase("Vanzare-Cumparare")
var combo:javax.faces.component.UIComponent = getComponent("txt_tipcontractcv1");
var comboVal = combo.getValue(); 
if (comboVal.equalsIgnoreCase("Vanzare-Cumparare")) {
    document.getElementById("#{id:label2}").style.display = "block"; // or "inline"
} else {
    document.getElementById("#{id:label2}").style.display = "none";
}