我尝试使用<f:setPropertyActionListener>
内的<p:commandLink>
设置属性值到目标bean,如下所示。
<h:form id="form" prependId="true">
<p:panel id="dataPanel" closable="false" toggleOrientation="horizontal" toggleable="true" style="border: none; text-align: center;">
<p:dataGrid id="dataGrid" value="#{productDetailsManagedBean}" var="row" rowIndexVar="rowIndex" rows="4" first="0" columns="1" paginator="true" paginatorAlwaysVisible="false" pageLinks="10" lazy="true" rowsPerPageTemplate="5,10,15">
<p:commandLink process="@this">
<h:outputText styleClass="ui-icon ui-icon-search" style="margin:0 auto;" />
<!--row.subCatName is correctly retrieved here.-->
<f:setPropertyActionListener value="#{row.subCatName}" target="#{productDetailsManagedBean.subCatName}" />
</p:commandLink>
</p:dataGrid>
</p:panel>
</h:form>
相应的JSF托管bean如下。
@ManagedBean
@RequestScoped
public final class ProductDetailsManagedBean extends LazyDataModel<SubCategory>
{
public ProductDetailsManagedBean() {}
@EJB
private final ProductDetailsBeanLocal productService=null;
private String subCatName;
public String getSubCatName() {
return subCatName;
}
public void setSubCatName(String subCatName) {
System.out.println("setSubCatName() called. : "+subCatName); //Never invoked.
this.subCatName = subCatName;
}
//The following methods are not needed to be reviewed.
@Override
public List<SubCategory> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters)
{
int rowCount = productService.rowCount().intValue();
setRowCount(rowCount);
return productService.getList(first, pageSize);
}
}
单击<p:commandLink>
时,应调用bean setSubCatName(String subCatName)
中相应的setter方法,但从不调用此方法,因此bean属性subCatName
永远不会设置为值。
我在这里俯瞰什么?
我使用的是Mojarra 2.2.5和PrimeFaces 4.0。
process
的{{1}}属性已设置为<p:commandLink>
。我已经尝试将@this
的{{1}}设置为prependId
,但这也没有任何区别。
修改
当托管bean的范围从<h:form>
更改为false
时,此方法有效。这也适用于@RequestScoped
bean。我在这做什么错?这是预期的行为吗?