我想使用带有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中
答案 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(" ");
} 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',这是可以接受的。