PrimeFaces,如何避免p:selectOneMenu选择值中p:列的连接

时间:2013-01-30 15:46:36

标签: jsf primefaces selectonemenu

我想使用带有p:列的自定义内容的p:selectOneMenu(如http://www.primefaces.org/showcase-labs/ui/selectOneMenu.jsf所示),我想在下拉字段中显示所选值,其中显示的信息少于显示的值在可能值的下拉列表中。

例如,下面的代码在选择后应该只显示 bnkCod (例如'1')。
相反,它显示 bnkCod bnkNam (例如'1 Bank 1')的串联。

bnkCod bnkNam 都是String,转换器正常工作。

有人可以帮我解决问题吗?

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> 

豆:

List<Bank> banks = new ArrayList<Bank>();
banks.add(new Bank("1","Bank 1"));
banks.add(new Bank("2","Bank 2"));

转换器:

@FacesConverter(forClass=Bank.class,value="bankCodeConverter")
public class MeansOfPaymentConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        //... retrieve bean
        return bean.getBanksMap().get(value);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if(value instanceof Bank) 
            return ((Bank) value).getBnkCod();
        else
            return null;
    }
}

我正在使用PrimeFaces 3.4,问题出现在Safari 6.0和Firfefox 18.0.1中

3 个答案:

答案 0 :(得分:1)

我发现解决这个问题的方法是覆盖selectOneMenu widget 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);
    }
  }
}

使用列时,label的格式为\ ncol1 \ ncol2 \ ncolN。所以我的解决方法是在分割\ n。

的标签后获取第一个非空字符串

答案 1 :(得分:0)

你可以用列来尝试这样的事情:

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

同时更新您的列表,方法是在selectOneMenu

中添加
<p:ajax update="@this" process="@this"/>

答案 2 :(得分:0)

我找不到问题的任何解决方案。 因此,我决定显示两个值'p.bnkCod'和'p.bnkNam',这是可以接受的。