【发布时间】: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?我这样做的方法是在按钮上加上一个<f:ajax listener="#{entityBB.cancel()}" render="myId,myId2,...">和一个<o:ignoreValidationFailed>。 -
是否应该将Cancel按钮重命名为Clear或Reset?让我们保持概念清晰。
-
嗯,这是
immediate所做的事情之一。我从上面的观点是o:ignoreValidationFailed应用于您的h:commandButton这样做仅,没有在应用请求值阶段执行您的业务逻辑带来的所有令人讨厌的惊喜。