Jsf PrimeFaces,如何避免p:SelectOne菜单选定值中p:column的串联
我希望使用p:selectOne菜单,其中包含p:columns(如中所示)的自定义内容,并且我希望在下拉字段中显示所选的值,其信息少于可能值下拉列表中显示的信息 例如,下面的代码在选择后应仅显示bnkCod(例如“1”)。Jsf PrimeFaces,如何避免p:SelectOne菜单选定值中p:column的串联,jsf,primefaces,selectonemenu,Jsf,Primefaces,Selectonemenu,我希望使用p:selectOne菜单,其中包含p:columns(如中所示)的自定义内容,并且我希望在下拉字段中显示所选的值,其信息少于可能值下拉列表中显示的信息 例如,下面的代码在选择后应仅显示bnkCod(例如“1”)。 相反,它显示了bnkCod和bnkNam的连接(例如“1组1”)。 bnkCod和bnkNam都是字符串,转换器工作正常 有人能帮我解决这个问题吗 JSF: <p:selectOneMenu value="#{bean.bank}" converter="bankC
相反,它显示了bnkCod和bnkNam的连接(例如“1组1”)。
bnkCod和bnkNam都是字符串,转换器工作正常 有人能帮我解决这个问题吗 JSF:
<p:selectOneMenu value="#{bean.bank}" converter="bankCodeConverter" var="p">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{bean.banks}"
var="bank" itemLabel="#{bank.bnkCod}" itemValue="#{bank}"/>
<p:column>
#{p.bnkCod}
</p:column>
<p:column>
#{p.bnkNam}
</p:column>
</p:selectOneMenu>
我使用的是PrimeFaces 3.4,这个问题在Safari 6.0和Firfefox 18.0.1中都出现了。您可以在列中尝试类似的方法吗:
<p:column rendered="#{p.bnkCod == bean.bank.bnkCod}">
#{p.bnkCod}
</p:column>
<p:column rendered="#{p.bnkCod == bean.bank.bnkCod}">
#{p.bnkNam}
</p:column>
<p:column colspan="2" rendered="#{p.bnkCod != bean.bank.bnkCod}">
#{p.bnkCod}
</p:column>
我找不到解决这个问题的办法。
因此,我决定显示“p.bnkCod”和“p.bnkNam”这两个值,这是可以接受的。我发现解决这个问题的方法是覆盖selectOneMenu小部件js代码 1) 打开primefaces jar文件并在META-INF/resources/primefaces下查找primefaces.js 2) 将PrimeFaces.widget.SelectOneMenu的代码复制到一个新的js文件中,并从主应用程序页面调用它(可能是一个模板) 3) 用以下代码覆盖方法setLabel:
setLabel : function(a) {
var theLabel = a;
var labelArray = a.split('\n');
for ( var idx = 0; idx < labelArray.length; idx++) {
if (labelArray[idx] != '') {
theLabel = labelArray[idx];
break;
}
}
if (this.cfg.editable) {
this.label.val(theLabel);
} else {
if (theLabel == "") {
this.label.html(" ");
} else {
this.label.text(theLabel);
}
}
}
setLabel:函数(a){
var-theLabel=a;
var labelArray=a.split('\n');
for(var idx=0;idx
使用列时,标签的格式为\ncol1\ncol2\ncolN。因此,我的解决方法是在拆分标签后获得第一个非空字符串。\n.Hi@partlov,谢谢您的消息。我尝试了您提出的解决方案,但我得到的是一个包含三列的下拉列表,其中前两列仅针对所选条目正确填写(也显示在下拉值中),而所有其他条目仅在第三列中填写其bnkCod。我希望下拉列表中只有两列(显示bnkCod和bnkNam),下拉值中只有所选条目的bnkCod。我不理解您的问题:当您通过添加
{p.bnkCod}明确指定两个字段都应显示时,为什么您希望它只显示`{p.bnkNam}`
还有bnkName
?嗨@kolossus,让我重新表述一下我的问题。下拉列表显示字段中的选定值以及激活时可能的值列表,对吗?我希望在所选值中只包含“#{p.bnkCod}”,但同时包含“#{p.bnkCod}”和“#{p.bnkNam}”。我在本地Tomcat 7.0.25上安装了PrimeFaces Showcase(Mojarra-2.1.10上的PrimeFaces-3.5-SNAPSHOT),并且我注意到本地安装和实时Showcase之间的行为不同。在中的“带过滤器的内容”选择菜单中,一旦我选择梅西条目,我将在selectOneMenu字段值中获得“梅西”。在我的本地安装中,当我执行相同操作时,字段值中会出现“Messi-10”。所以,我的代码可能是正确的,但还有一些东西,在其他地方,需要修复。。
<p:column rendered="#{p.bnkCod == bean.bank.bnkCod}">
#{p.bnkCod}
</p:column>
<p:column rendered="#{p.bnkCod == bean.bank.bnkCod}">
#{p.bnkNam}
</p:column>
<p:column colspan="2" rendered="#{p.bnkCod != bean.bank.bnkCod}">
#{p.bnkCod}
</p:column>
<p:ajax update="@this" process="@this"/>
setLabel : function(a) {
var theLabel = a;
var labelArray = a.split('\n');
for ( var idx = 0; idx < labelArray.length; idx++) {
if (labelArray[idx] != '') {
theLabel = labelArray[idx];
break;
}
}
if (this.cfg.editable) {
this.label.val(theLabel);
} else {
if (theLabel == "") {
this.label.html(" ");
} else {
this.label.text(theLabel);
}
}
}