Java primefaces/jsf中p:dataTable/p:dataGrid/p:dataList中的p:commandButton
我在p:dataGrid中有一个p:commandButton(我也尝试过p:dataTable,p:dataList) 命令按钮操作侦听器方法未执行,但对服务器进行了ajax调用 请注意,dataGrid是延迟加载的 请查找示例代码:Java primefaces/jsf中p:dataTable/p:dataGrid/p:dataList中的p:commandButton,java,jsf,primefaces,glassfish,Java,Jsf,Primefaces,Glassfish,我在p:dataGrid中有一个p:commandButton(我也尝试过p:dataTable,p:dataList) 命令按钮操作侦听器方法未执行,但对服务器进行了ajax调用 请注意,dataGrid是延迟加载的 请查找示例代码: <p:dataGrid id="portfolioView" value="#{controller.values}" var="p" lazy="true" rendered="#{controller
<p:dataGrid id="portfolioView" value="#{controller.values}" var="p"
lazy="true" rendered="#{controller.hasValues()}"
style="width: 100%" paginator="true" rows="20" columns="1">
<p:column id="portfolioViewColumn">
<h:panelGroup id="portfolioPanel" layout="block"
style="width: 95%; padding: 20px; margin-bottom: 5px; margin-top: 5px; border-radius: 5px"
styleClass="importantpanel_down_less_spread">
<h:panelGrid columns="3" >
<p:graphicImage value="#{controller.photo}" width="60" height="60"/>
<h:panelGroup layout="block" style="width: 100%" >
<h:outputText value="#{controller.user.name}" style="font-weight: bold; font-size: 12px"/>
<br/>
<h:outputText value="#{p.dateString}"
style="font-weight: bold; font-size: 12px; color: #454545/>
<br/>
<h:outputText value="#{p.portfolioTitle}"
style="font-weight: bold; font-size: 14px; color: #454545"/>
</h:panelGroup>
<h:panelGroup layout="block" >
<h:form>
<p:commandButton icon="ui-icon-trash" id="deletePortfolio" value="Delete" title="Delete this portfolio"
styleClass="fs-button-portfolio" actionListener="#{controller.deleteValue(p)}"/>
<p:commandButton icon="ui-icon-pencil" id="editPortfolio" value="Edit" title="Edit this portfolio"
styleClass="fs-button-portfolio" actionListener="#{controller.editValue(p)}" />
</h:form>
</h:panelGroup>
</h:panelGrid>
</p:column>
<p:dataGrid>
public void deleteValue(Portfolio portfolio) {
try {
System.out.println("Removing portfolio ...");
portfolioFacade.remove(portfolio);
JsfUtil.addSuccessMessage("Portfolio Removed", "You have deleted a portfolio from your timeline");
} catch (Exception e) {
JsfUtil.addErrorMessage("Failure", "Sorry! We have failed to remove this portfolio from your timeline.");
}
}
public void editValue(Portfolio portfolio) {
System.out.println("Preparing portfolio edit...");
this.currentPortfolio = portfolio;
}
当一个迭代组件中的一个命令组件被调用时,JSF将在处理表单提交的过程中在迭代组件上重复,以便找到被调用的命令。因此,为了成功找到它,它要求value=“#{controller.values}”
和rendered=“#{controller.hasValues()}”
在处理表单提交时与显示表单时完全相同地评估
你的具体问题表明它没有。如果getValues()
返回一个不兼容的更改列表(即bean是请求范围的,没有根据请求参数保留列表),或者isHasValues()
返回false
,那么JSF将无法对其进行重复,因此也无法找到正在调用的命令
因此,为了解决这个问题,您只需要确保getValues()
和isHasValues()
在处理表单提交时返回的值与在显示表单时返回的值完全相同。一种简单的方法是将bean放在视图范围中(并确保您没有在getter方法中执行业务逻辑,而只在(post)构造函数和(action)侦听器方法中执行业务逻辑)
另见:
- -第4点和第5点
您能否显示支持bean的代码,至少是相关部分(这两个方法,以及带有注释的类定义)?您能否将支持bean的范围更改为viewscoped或sessionscoped?我已经意识到,如果我将数据模型从LazyDataModel更改为ListDataModel,它可以正常工作。如何提供这种一致性?我在会话范围bean的post-construct方法中初始化LazyDataModel