Primefaces对话框不更新

时间:2011-11-21 15:32:23

标签: ajax jsf primefaces

我在更新主要对话框时面临问题

目前我正在显示一个主题对话框,其中包含一些可编辑格式的表单元素。 在单击更改链接时,表单中有一些输出文本字段可用更改链接,输出文本字段应以可编辑格式显示在其中包含接受和取消按钮的对话框中。

下面是我正在使用的代码片段我正在调用一个监听器,我将设置值以可编辑格式在对话框中显示的属性,每次我使用's render属性更新对话框

render =对话框的id。

此外,当我尝试更新对话框内的内容时,我收到了一些找不到的ajax错误ID。

我也尝试将对话框放在面板中,即使这不起作用。

                          

                

            <h:panelGrid columns="5" >
            <h:outputText value="Overrride State Date" />
            <p:spacer width="5" height="5" />
            <h:outputText value="Overrride End Date" />
            <p:spacer width="5" height="5" />
            <h:outputText value="New Value"/>
            <p:calendar value="#{certInquiry.ovrStartDt}" showOn="button"/>
            <p:spacer width="5" height="5" />
            <p:calendar value="#{certInquiry.ovrEndDt}" showOn="button"/>
            <p:spacer width="5" height="5" />
            <h:inputText value="#{certInquiry.newVal}"/>
            </h:panelGrid>  
            <div align="center">
            <p:commandButton value="Accept"
                oncomplete="xyz.hide()" /> <p:spacer width="10"
                height="5" /> <p:commandButton value="Cancel"
                onclick="xyz.hide()" type="reset" /></div>

                </h:form>
        </p:dialog>

这里我使用render属性更新对话框但是我无法更新对话框,当我刷新屏幕时数据显示正确时,它仍然显示以前的数据。

请帮我解决这个问题。

提前致谢。

4 个答案:

答案 0 :(得分:3)

您尝试使用此代码:

<p:dialog widgetVar="xyz" >
   <p:panel id="xyzBody">
...
</p:panel>
</p:dialog>


<p:commandButton value="Open dialog"  oncomplete="xyz.show()"
    update="xyzBody"
     actionListener="fillFieldListener"  /> 

答案 1 :(得分:1)

首先,您应该发布entire xhtml代码,而不仅仅是对话框内容和结束标记......

但是我想我知道问题出在哪里:你不应该在对话框中使用render属性,它的javascript函数showhide绰绰有余。此外,您应该知道you can't update something you haven't rendered,因为在html页面(客户端/用户端)中找不到非呈现的组件。您所要做的就是:

    <h:form>
            <p:dialog id="myDialog" header="My Options" widgetVar="xyz" showEffect="fade" hideEffect="fade">

            <h:panelGrid columns="5" >
            <h:outputText value="Overrride State Date" />
            <p:spacer width="5" height="5" />
            <h:outputText value="Overrride End Date" />
            <p:spacer width="5" height="5" />
            <h:outputText value="New Value"/>
            <p:calendar value="#{certInquiry.ovrStartDt}" showOn="button"/>
            <p:spacer width="5" height="5" />
            <p:calendar value="#{certInquiry.ovrEndDt}" showOn="button"/>
            <p:spacer width="5" height="5" />
            <h:inputText value="#{certInquiry.newVal}"/>
            </h:panelGrid>  
            <div align="center">
            <p:commandButton value="Accept"
                oncomplete="xyz.hide()" /> <p:spacer width="10"
                height="5" /> <p:commandButton value="Cancel"
                onclick="xyz.hide()" type="reset" /></div>    
        </p:dialog>
<p:commandButton value="Update Dialog" action="#{MyBean.MyMethod}" update="MyDialog" />
</h:form>

所以你的表单应该在对话框之外,这样更好更简单;正如您所看到的,UpdateDialog按钮位于对话框之外,并在运行操作方法后更新对话框(但也可以更新对话框中的面板)。 此外,我看到那些“接受”和“取消”按钮仅用于测试,因为它们在没有任何服务器实现的情况下执行相同操作...

答案 2 :(得分:0)

您的对话框是否在<ui:include>标记内?

如果是,则检查页面的源或html,并验证该对话框仅添加到页面一次。 (您可能将appendToBody设置为true

我遇到了这个问题,其中对话框被添加到正文multiple times(可能是由于JSF生命周期)。这会导致意外的结果,如对话框没有得到更新。

我通过删除<ui:include>之外的对话框解决了这个问题,或者您可以有条件地渲染<ui:include> content

PS:我相信您已经遵循了其他答案,例如将对话框内容包装在容器中。 正如@spauny所提到的,你应该发布所有相关的xhtml代码。

答案 3 :(得分:0)

我看到一个结束但不是整个画面,虽然我已经走了这条路,并为你找到答案。

如果您在对话框外有表单,请尝试在对话框中对其进行排序。例如,

<p:dialog ...>
    <h:form>
        ...contents...
    </h:form>
</p:dialog>