-1

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

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

bnkCodbnkNam都是字符串,转换器工作正常。

任何人都可以帮我解决问题吗?

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

4

3 回答 3

1

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

使用列时,标签的格式为 \ncol1\ncol2\ncolN。所以我的解决方法是在将标签拆分为 \n 后获取第一个非空字符串。

于 2013-11-08T14:35:13.580 回答
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"/>
于 2013-01-30T16:04:58.057 回答
0

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

于 2013-10-24T08:08:24.393 回答