我有<h:dataTable>
,其中有<p:commandLink>
。
我需要在<p:commandLink>
时从数据库中获取一些数据
单击并在弹出窗口中显示它,我正在使用<p:dialog>
。
<h:form id="form">
<h:dataTable width="80%" value="#{controller.items}" var="a" binding="#{bean.table}"
rendered="#{not empty controller.items}">
<h:column>
<h:outputText value="#{a.date}" />
</h:column>
<h:column>
<h:outputText value="#{a.name}" />
</h:column>
<h:column>
<p:commandLink value="View" action="#{controller.getData()}"
update=":form:dialog" oncomplete="w_dialog.show();return false;">
</p:commandLink>
</h:column>
</h:dataTable>
<p:dialog header="Test" widgetVar="w_dialog" width="600px" height="500px"
id="dialog" modal="true" draggable="true" appendToBody="true" rendered="#{sessionScope.sample ne null}">
<ui:include src="sample.xhtml"/>
</p:dialog>
</h:form>
我需要捕获被单击的行的数据并从数据库中获取数据。 我的bean和控制器类如下:
@Named
@SessionScoped
public class Bean implements Serializable
{
private HtmlDataTable table;
// getters and setters
}
@Named
@SessionScoped
public class Controller implements Serializable
{
@Inject
private Bean bean;
public void getData(){
bean.getTable().getRowData();
SampleClass sample=new SampleClass();
// fetches data from database and populates it within sample instance
FacesContext context = FacesContext.getCurrentInstance();
context.getExternalContext().getSessionMap()
.put("sample", sample);
}
}
<p:dialog>
包含一个名为sample.xhtml
的文件,其中包含引用
到SampleClass
。所以我在rendered
中使用<p:dialog>
属性来避免
加载我的xhtml页面时NullPointer Exception
。此外,类型为sample
的{{1}}已插入
sessionMap仅在单击时执行控制器方法SampleClass
之后
getData()
。
问题是即使在方法之后弹出窗口也永远不会显示
执行<p:commandLink>
并将getData()
插入SessionMap。
我使用sample
更新update=:form:dialog
后的对话框
点击。但似乎对话框的<p:commandLink>
属性永远不会得到
更新。所以我看不到rendered
。
我错过了什么吗?
答案 0 :(得分:2)
您无法更新不存在的组件。 rendered
属性确定组件是否将显示在DOM树中,而不仅仅是其可见性。这意味着,如果为false,则该组件将不可用于JSF,用于重新渲染/更新术语。
标准解决方案是将组件包装到容器元素中并更改它(顺便说一句,我建议您不要将getter
方法用于操作目的):
<h:panelGroup id="parentPanel">
<p:dialog header="Test" widgetVar="w_dialog" width="600px" height="500px"
id="dialog" modal="true" draggable="true"
appendToBody="true" rendered="#{sessionScope.sample ne null}">
<ui:include src="sample.xhtml"/>
</p:dialog>
</h:panelGroup>
<p:commandLink value="View" action="#{controller.showData()}"
update=":form:parentPanel" />