3

我有一个请求范围的 bean,它填充了表单中的各种属性。然后使用这些属性来更新另一个视图范围的 bean。现在我想给用户以这样一种方式重置表单的可能性,即所有表单字段都保存第一次加载页面时的值。这些值是通过 bean 本身定义的:

@ManagedBean
@RequestScoped
public class ItemSearchBean {

    private Rarity minRarity = Rarity.None;
    private Rarity maxRarity = Rarity.None;

    ...

}

请注意,尽管表单提交按钮实际上调用了一个 ajax 请求,因此不会继续重新加载整个页面。

提交按钮:

<p:commandButton value="Search"
    actionListener="#{itemSearchBean.refreshTable}"
    update="itemTable,notify"/>

我已经尝试使用一个简单的重置按钮,但它只是将表单重置为最后提交的值:

<p:commandButton type="reset" value="Reset"/>

必须以某种方式向服务器询问新的 bean(或阻止它填充 bean),但我不知道如何做到这一点。

4

2 回答 2

2

您应该能够使用指向同一视图的纯 HTML 链接来做到这一点:

<a href="yourpage.xhtml">Reset</a>

或者让 JSF 为您创建链接:

<h:link value="Reset" />

这样,您将获得一个新的 GET 请求,该请求将创建一个新的 UIViewRoot,就像您在新的浏览器选项卡中访问同一个视图一样。

如果你想要一个按钮,你可以使用h:button

<h:button value="Reset" />

此按钮将依赖于在点击时重新加载页面的 Javascript。

于 2012-07-31T13:19:43.270 回答
1

您也可以进行两阶段设置。更多的工作,但如果你更进一步,它允许各种撤消工作流程。

基本上,有两个 bean 用通常的访问器/修改器对封装您的表单。然后在您的控制器中,仅公开一个(x 或 y),这就是您的“表单 bean”。在 y 中,您存储从存储库检索的原始副本,这样您就可以进行字段级别或 bean 级别的还原,而无需重新加载页面或从存储库进行完整的数据重新编组。

所以,简单地说:

  • 2 个封装表单的 bean(如果它映射到表单上,您甚至可以重用您的实体)。
  • 在数据编组期间从 repo 中填写两者
  • 在 facelets 中向用户公开一个
  • 保留第二个作为重置/还原字段或整个表单的备份

还有其他方法可以剥去“撤消”猫的皮,这只是另一种。

于 2012-07-31T17:51:03.570 回答