Jsf PrimeFaces,如何避免p:SelectOne菜单选定值中p:column的串联

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

我希望使用p:selectOne菜单,其中包含p:columns(如中所示)的自定义内容,并且我希望在下拉字段中显示所选的值,其信息少于可能值下拉列表中显示的信息

例如,下面的代码在选择后应仅显示bnkCod(例如“1”)。
相反,它显示了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("&nbsp;");
    } 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("&nbsp;");
    } else {
      this.label.text(theLabel);
    }
  }
}