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";
}