我正在使用<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>
答案 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元素,以便样式指示它是否可见。