<p:dialog>呈现的属性未使用<p:commandlink update =“:dialog”> </p:commandlink> </p:dialog>进行更新

时间:2013-10-11 12:48:48

标签: jsf-2 primefaces dialog

我有<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

我错过了什么吗?

1 个答案:

答案 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" />