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

时间:2014-09-02 09:21:14

标签: xpages xpages-ssjs

我正在使用<xe:djTabContainer>和10 <xe:djTabPane>包含多个字段组件。

有一个主要组合框,其值将决定显示或不显示哪些字段,这样就可以实现文档结构。

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

考虑到在该类别中有> 50个字段&lt;显示和隐藏它们&gt;,我应该使用其他方法/方法吗?谢谢你的时间。

<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>

3 个答案:

答案 0 :(得分:3)

我会转过身来。让标签和字段询问组合框是否应该渲染它们。让组合框的onchange事件启动面板的部分刷新,其中包括您想要显示/隐藏的所有字段。

如果您的&gt; 50个字段都在一个地方,您可以使用面板对其进行框架设置并在那里设置渲染属性。

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

rendered="#{javascript:viewScope.tipcontractcv1 == 'Vanzare-Cumparare'}"

或者如果它绑定到文档字段,那么

rendered="#{javascript:document1.getItemValueString('txt_tipcontractcv1') === 'Vanzare-Cumparare'}"

<强>更新

根据您的答案https://stackoverflow.com/a/25636661/2065611中的代码,执行以下步骤,以便使用Dojo标签容器:

1

将标签和字段放在具有ID但具有呈现属性的面板中

<xp:panel id="panel1">
    <xp:label value="Persoane spre informare" ... id="label2">   
         <xp:this.rendered><![CDATA[#{javascript:
            Contr.getItemValueString("txt_tipcontractcv1") == "Vanzare-Cumparare"
         }]]></xp:this.rendered>
    </xp:label>
    ... other label and fields ...
</xp:panel>

您也可以创建其他面板“panel2”,“panel3”,......它们可以放在不同的djTabPanes中。

2

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

            <xp:eventHandler
                event="onchange"
                submit="false">
                <xp:this.script><![CDATA[
                    XSP.partialRefreshPost("#{id:panel1}", {
                        onComplete: function() {
                            XSP.partialRefreshPost("#{id:panel2}");
                        }
                    });
                ]]></xp:this.script>
            </xp:eventHandler>

3

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

<xp:panel id="panel1">
    <xp:panel id="panelRendered1"
         <xp:this.rendered><![CDATA[#{javascript:
            Contr.getItemValueString("txt_tipcontractcv1") == "Vanzare-Cumparare"
         }]]></xp:this.rendered>
        <xp:label value="Persoane spre informare" ... id="label2" />   
        ... other label and fields ...
    </xp:panel>
</xp:panel>

答案 1 :(得分:2)

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

if (comboVal == "Vanzare-Cumparare") 

即使它被称为&#34; SSJS&#34;它真的不是&#34; JavaScript&#34; ......你几乎和Java一起工作。在Java中,一切都是对象。即使是文字字符串。所以进入&#34; Vanzare-Cumparare&#34;你几乎创造了一个新的对象。您可以在SSJS编辑器的typeahead中看到这一点。尝试输入&#34;任何&#34;。 &lt; - 注意您需要输入该期间。

如果声明是这样做的话:

if ("Vanzare-Cumparare".equalsIgnoreCase(comboVal)

你可以反驳它我想:

if (comboVal.equalsIgnoreCase("Vanzare-Cumparare")

应该给你相同的结果。我认为有时候你可以使用==,但很可能它会在某些时候咬你,无论如何。所以我建议不要这样做。

我不确定我是否按照你的方法行事。我想这有点道理,但如果是我,我会采用不同的方式。我知道,我个人从来没有尝试像SSJS那样抓住SSJS中的组件:var combo:javax.faces.component.UIComponent - 我从未见过这种需要。 我更喜欢使用范围变量,然后在标签的渲染属性中抓取该范围变量并使用它来确定渲染值 - true或false。

答案 2 :(得分:0)

我看到了一个真正的问题。如果当前未呈现组件,则无法使用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元素,以便样式指示它是否可见。