-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 に答える