【发布时间】:2014-04-02 11:50:28
【问题描述】:
我正在使用PrimeFaces 开发一个简单的页面,其中列出了一些项目的信息。我想添加一个按钮来打开一个包含详细信息的对话框。代码非常简单。但是它不起作用:
<h:form id="projectForm">
<p:dataTable id="projectDataTable" var="project" value="#{projectMB.projects}" >
<p:column sortBy="name" headerText="Name">
<h:outputText value="#{project.name}" />
</p:column>
<p:column sortBy="status" headerText="Status">
<h:outputText value="#{project.status}" />
<h:outputText value=" (#{project.progress}%)" />
</p:column>
<p:column style="width:4%">
<p:commandButton update=":projectForm:display" id="selectButton" oncomplete="PF('projectDialog').show()" icon="ui-icon-search" title="View">
<f:setPropertyActionListener value="#{project}" target="#{projectMB.selectedProject}" />
</p:commandButton>
</p:column>
</p:dataTable>
<center>
<p:commandButton id="refreshProjectsButton" actionListener="#{projectMB.refreshProjectList}" icon="ui-icon-refresh" update="projectDataTable"/>
</center>
<p:dialog header="Project Detail" widgetVar="projectDialog" resizable="false" id="projectDlg" showEffect="fade" modal="true">
<h:panelGrid id="display" columns="2" cellpadding="4" style="margin:0 auto;">
<h:outputText value="Name:" />
<h:outputText value="#{projectMB.selectedProject.name}" style="font-weight:bold"/>
<h:outputText value="Description:" />
<h:outputText value="#{projectMB.selectedProject}" style="font-weight:bold"/>
</h:panelGrid>
</p:dialog>
</h:form>
我通过添加包含dialog 的额外表单找到了解决方案:
<h:form id="projectForm">
<p:dataTable id="projectDataTable" var="project" value="#{projectMB.projects}" >
<p:column sortBy="name" headerText="Name">
<h:outputText value="#{project.name}" />
</p:column>
<p:column sortBy="status" headerText="Status">
<h:outputText value="#{project.status}" />
<h:outputText value=" (#{project.progress}%)" />
</p:column>
<p:column style="width:4%">
<p:commandButton update=":projectForm2:display" id="selectButton" oncomplete="PF('projectDialog').show()" icon="ui-icon-search" title="View">
<f:setPropertyActionListener value="#{project}" target="#{projectMB.selectedProject}" />
</p:commandButton>
</p:column>
</p:dataTable>
<center>
<p:commandButton id="refreshProjectsButton" actionListener="#{projectMB.refreshProjectList}" icon="ui-icon-refresh" update="projectDataTable"/>
</center>
</h:form>
<h:form id="projectForm2">
<p:dialog header="Project Detail" widgetVar="projectDialog" resizable="false" id="projectDlg" showEffect="fade" modal="true">
<h:panelGrid id="display" columns="2" cellpadding="4" style="margin:0 auto;">
<h:outputText value="Name:" />
<h:outputText value="#{projectMB.selectedProject.name}" style="font-weight:bold"/>
<h:outputText value="Description:" />
<h:outputText value="#{projectMB.selectedProject}" style="font-weight:bold"/>
</h:panelGrid>
</p:dialog>
</h:form>
我的问题是:为什么第一个代码不起作用 - 刷新 java bean 中列表的方法 projectMB.refreshProjectList 永远不会被调用。我在 javascript 和 java 中没有收到任何错误。
【问题讨论】:
-
像往常一样,“它不起作用”是对问题的非常模糊的描述。您还应该提供一个最小的示例,在 99% 的情况下,您可以在不发布整个代码墙的情况下复制问题,这对读者来说是一种噪音。
-
@Łukasz웃Lツ 我认为“永远不会调用在 java bean 中刷新列表的方法 projectMB.refreshProjectList”这句话解释了问题所在。
-
您单击按钮,没有任何反应,日志中绝对没有消息,javascript控制台中也没有请求或错误消息?如果删除数据表会发生什么?我做了一个最小的例子,有 2 个按钮 - 一个调用服务器方法,第二个打开对话框。该对话框采用相同的形式。一切运行顺利。
-
好吧,我不是在寻找解决方案。正如我发布的那样,我已经找到了一个(添加其他表格)。我想知道为什么第一个代码不起作用,而第二个代码起作用。 java代码中没有错误,javascript控制台中没有日志。 Emil Kaminski 指出帖子中有人解释说对话框可以放在 DOM 树中的任何位置,但我想知道为什么。
标签: java jsf primefaces xhtml