【问题标题】:Cancel button jsf not resetting entity取消按钮jsf不重置实体
【发布时间】:2014-01-27 14:00:11
【问题描述】:

我正在尝试实现一个取消按钮来清除我的实体中的字段。 但是,当我将实体设置为 null 时,我的字段仍然保留它们的值。

代码:

EntityBB的cancel方法(注意调试器可以到达cancel方法):

public void cancelAddStandardLetter() {
    setEntity(null);
    standardLetterInit();
}

此方法确实将实体中的所有值设置回 null 并且 standardLetterInit 方法设置了一些需要的默认值(尝试了相同的方法而没有 standardLetterInit -> 相同的结果)。

xhtml 页面(其他输入字段被省略):

<o:form includeRequestParams="true" id="addStandardLetterForm">

    <h:inputTextvalue="#{entityBB.entity.fileName}" styleClass="rInput"/>

    <h:commandButton value="Cancel" immediate="true"
            styleClass="floatRight"
            action="#{entityBB.cancelAddStandardLetter()}" />
</o:form>

按下“取消”按钮后,在“文件名”字段中输入的值仍然存在。这个怎么可能?

【问题讨论】:

  • 听起来你想要o:ignoreValidationFailed 而不是immediate="true"(或者只是重新加载页面并在@PostConstruct 方法中初始化)?
  • 它背后的逻辑比这个小设置更复杂,但基本原理是一样的。我需要使用 immediate="true" 因为其中还有一个保存按钮等。所以我只能在ignoreValidation上填写完整的表格。 PostConstruct 也无法使用,因为在我进入此屏幕之前我的实体已经存在。 (Bean 是视图范围的,并且此输入字段通过单击按钮呈现。)
  • 我不明白。您有一个复杂的表单,并且可以通过单击“取消”按钮来重置某些字段。为什么这里需要immediate?我这样做的方法是在按钮上加上一个&lt;f:ajax listener="#{entityBB.cancel()}" render="myId,myId2,..."&gt; 和一个&lt;o:ignoreValidationFailed&gt;
  • 是否应该将Cancel按钮重命名为ClearReset?让我们保持概念清晰。
  • 嗯,这是immediate 所做的事情之一。我从上面的观点是o:ignoreValidationFailed 应用于您的h:commandButton 这样做,没有在应用请求值阶段执行您的业务逻辑带来的所有令人讨厌的惊喜。

标签: jsf jsf-2 omnifaces


【解决方案1】:

确保 bean 是视图范围的并使用普通的 GET 按钮。

<h:button value="Cancel" />

这基本上刷新了页面。它将重新创建视图范围的 bean 实例。无需提交整个表格。如果输入值仍然出现,那么它要么是浏览器缓存,要么是自动完成/自动填充,您可以分别使用 servlet filterautocomplete="off" 来控制它们。

【讨论】:

  • 如果我这样做,那么我将丢失我需要保留的 backingBean 中的其他值。所以这似乎也不是一个选择。但我将重构整个设置,以便更轻松地维护应用程序,这也可能解决我的问题。
猜你喜欢
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 2018-05-13
  • 2022-01-01
相关资源
最近更新 更多