我想动态添加Primefaces组件。我正在使用类似于this one的解决方案,这在前面已经讨论过:
<h:form>
<h:panelGrid columns="2">
<p:dataGrid id="categoriesGrid" value="#{bean.categories}"
var="categoryBean" rowIndexVar="rowIndex">
<p:column>
<p:selectOneMenu id="categorySelect" effect="drop"
value="#{categoryBean.selectedCategory}" >
<f:selectItems value="#{categoryBean.availableCategories}"
var="category" itemLabel="#{category.name}"
itemValue="#{category}" />
</p:selectOneMenu>
</p:column>
</p:dataGrid>
<p:commandButton actionListener="#{bean.addNewCategory}"
value="Add category" update="categoriesGrid"/>
</h:panelGrid>
</h:form>
但它有问题。在点击“添加类别”按钮后,我得到了回复的示例:
<?xml version='1.0' encoding='UTF-8'?>
<partial-response>
<error>
<error-name>
class javax.faces.component.UpdateModelException
</error-name>
<error-message>
<![CDATA[/createTutorial.xhtml @85,65 value=
"#{categoryBean.selectedCategory}":java.util.NoSuchElementException]]>
</error-message>
</error>
</partial-response>
提前致谢
答案 0 :(得分:2)
问题在于我的豆子。为了获得所选项,我必须实现javax.faces.Converter
接口的自定义实现。在我看来,为这样一个简单的问题做很多工作(这个转换器必须能够访问数据源等)。所以我做了一个小技巧:
public class CategoryBean{
private list<Category> availableCategories;
private Category selectedCategory;
public Long getCSelectedCategory(){
// Get selected category by it's id and set selectedCategory
}
public void setSelectedCategory(Long selectedCategory){
return selectedCategory.getId();
}
// The remaining setters and getters
}
相应的页面代码现在看起来像:
<p:column>
<p:selectOneMenu id="categorySelect" effect="drop"
value="#{categoryBean.selectedCategory}" >
<f:selectItems value="#{categoryBean.availableCategories}"
var="category" itemLabel="#{category.name}"
itemValue="#{category.id}" />
</p:selectOneMenu>
</p:column>
请注意itemValue
属性和显示的访问方法。我遇到的错误是getter返回类型错误。
结束,在我的情况下动态添加新Primefaces组件的唯一问题是返回选定的值。您可以实现转换器或使用类似的技巧。
您觉得这样的伎俩是一个很好的解决方案吗?