【问题标题】:PrimeFaces dialog keeps the previous valuePrimeFaces 对话框保留以前的值
【发布时间】:2012-08-13 07:44:52
【问题描述】:

我使用数据表来显示一些记录。用户可以使用名为 actionsDialog 的对话框添加/更改记录。在保存记录之前,会显示一个名为 reasonDialog 的模式对话框,用户必须为当前操作输入一些原因。在我的逻辑中,我将数据保存到数据库后将原因设置为空。

重复操作时出现问题。原因包含先前的值。我已经调试了代码并注意到发生这种情况是因为原因被分配了 inputTextarea 的本地值。我怎样才能摆脱本地价值?我正在使用 PrimeFaces 3.0、Mojara 2.0.4、Tomcat 7。

我的原因对话框 facelet 是:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"  
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.prime.com.tr/ui">  
    <p:dialog header="#{label.reason}" widgetVar="reasonDialog"
        showEffect="fade" hideEffect="explode" modal="true" dynamic="true">        
        <h:panelGrid columns="2">
            <p:inputTextarea rows="5" cols="40" autoResize="false"
                value="#{recordsBean.reason}" maxLength="1024" />
            <f:facet name="footer">
                <p:outputPanel layout="block">
                <p:commandButton value="ok" update="genericRecords msgs"
                    action="#{recordsBean.execute}"
                    oncomplete="reasonDialog.hide();actionsDialog.hide()" />
                </p:outputPanel>
            </f:facet>
        </h:panelGrid>
    </p:dialog>
</ui:composition>

操作对话框如下所示:

<p:dialog id="actionsDialog" widgetVar="actionsDialog" dynamic="true"
    resizable="false" height="600" showEffect="fade" hideEffect="fade" modal="true">
<ui:include src="/WEB-INF/flows/genericRecord.xhtml"/>
<f:facet name="footer">  
        <p:outputPanel layout="block">
    <p:commandButton value="save" onclick="reasonDialog.show()" />
    <p:commandButton value="cancel" immediate="true" 
                oncomplete="actionsDialog.hide()" />
    </p:outputPanel>
</f:facet>
</p:dialog>

【问题讨论】:

  • 尝试为您的对话框分配一个 ID id="reasonDialogID" 并在打开对话框的按钮的update 属性中添加其 ID
  • 我已将 id="reasonDialogId" 添加到对话框并将其设置为按钮的更新属性,但它仍然无法正常工作。除此之外,原因值设置不正确,始终为空。
  • 你没有在那个按钮点击中调用一些bean方法吗?一种将数据设置为 recordsBean 的方法? recordsBean 的范围是什么,至少使其成为视图范围...
  • 当按钮被点击时,recordsBean 的执行方法被调用。 recordsBean 是会话范围的。
  • 确保在该按钮单击完成时打开reasonDialog 对话框?发布打开对话框的那个按钮的代码......

标签: java jsf dialog primefaces


【解决方案1】:

您需要在显示之前更新/刷新对话框的内容。在 update 属性中引用其(相对)客户端 ID,并将 show()onclick 移动到 oncomplete,以便在更新后进行。

<p:commandButton value="save" update="reasonDialog" oncomplete="reasonDialog.show()" />

否则它当然仍会显示关闭前的旧内容。您是通过 ajax/JS 与完全相同的页面进行交互,而不是一个新页面左右。

【讨论】:

  • 我试过 不工作。
  • 我也有同样的问题,但在一个对话框中出现了先前的错误。我认为它就像您的文章所说的 balusc.omnifaces.org/2012/03/… 。在 Prime 5.3 中这仍然是一个问题?
  • 找到了。在 Primefaces 中,您可以使用 RequestContext.getCurrentInstance().reset("your_form_id");重置表单值,或使用 p:commandButton 中的 resetValues="true"
  • @TiagoPC 我有同样的问题,但你的解决方案对我不起作用,你知道为什么吗?
  • 尝试使用 org.omnifaces.eventlistener.ResetInputAjaxActionListener 阶段监听器
【解决方案2】:

尝试在您的 p:commandButton 中添加 ajax="false" 属性;查看示例

   <p:commandButton value="ok" update="genericRecords msgs"
                action="#{recordsBean.execute}" ajax="false"
                oncomplete="reasonDialog.hide();actionsDialog.hide()" />

【讨论】:

    【解决方案3】:

    //如果不起作用,这是一个替代解决方案:

    没有什么对我有用...答案或 cmets.. 所以我必须执行以下操作:

    我使用ResetInputs 重置对话框中的表单以及从我的 bean 中打开它的方法。

    所以,

    <p:commandButton value="Show" actionListener="#{myBean.showDialog()}" update=":myForm">
                <p:resetInput target=":myForm"/>
    </p:commandButton>
    

    然后在我的 bean 中我做了这个方法,打开对话框(使用对话框的 widgetVar)并再次初始化我的对象,所以每次我打开我的对话框时,所有 &lt;p:inputText&gt;(或其他)中的值都会始终为空白/null。

    public void showDialog(){
    
        car = new Car();
        RequestContext context = RequestContext.getCurrentInstance();
        context.execute("PF('wvDialog').show();");
        //added widgetVar to myDialog called wvDialog 
    } 
    

    在对话框中我有一些&lt;p:inputText&gt;&lt;p:selectOneMenu&gt;&lt;p:calendar&gt; 和其他人。当对话框关闭、提交或出错时,它们都不会再次记住以前的值。 这是它对我有用的唯一方法,希望对某些人有所帮助!

    【讨论】:

    • 那么最好创建一个新问题,试图找出为什么它对您不起作用但对许多其他人起作用。现在还不清楚为什么应该(以及何时)选择您的解决方案而不是其他解决方案。 (BalusC 现在 9 个赞成的答案是它通常的做法)
    • 你说得对@Kukeltje,我应该......但当时我等不及答案......没有任何效果可能是因为我有几个列表取决于其他人,许多更新事件,并且不止一个对象,因为我使用了 4 个过滤器和操作......所以没有清理对话框。如果需要,我猜这就像一个替代解决方案,并且考虑到该帖子已有一年的历史。下次我会小心我的答案,我是新来的,喜欢 Primefaces,问候。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2013-09-21
    • 2017-06-04
    相关资源
    最近更新 更多