3

I have a request scoped bean which is filled with various properties from a form. These properties are then used to update another view scoped bean. Now I want to give the user the possibility to the reset the form in such a way that all form fields are holding the values they had when the page was loaded the first time. These values are defined through the bean itself:

@ManagedBean
@RequestScoped
public class ItemSearchBean {

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

    ...

}

Notice though that the form submiting button actually invokes a ajax request, therefor no full page reload goes on.

The submitting button:

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

I already tried to use a simple reset button, but it only reseted the form to the last submitted values:

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

One has to somehow ask the server for a fresh new bean (or prevent it to fill the bean), but I have no clue how to do this.

4

2 に答える 2

2

同じビューへのプレーンな HTML リンクでそれを行うことができるはずです。

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

または、JSF にリンクを作成させます。

<h:link value="Reset" />

このようにして、新しいブラウザー タブで同じビューにアクセスする場合と同様に、新しい UIViewRoot を作成する新しい GET 要求が作成されます。

代わりにボタンが必要な場合は、h:button

<h:button value="Reset" />

このボタンは、クリックするとページをリロードする Javascript に依存します。

于 2012-07-31T13:19:43.270 に答える
1

2フェーズのセットアップを行うこともできます。もう少し作業が必要ですが、さらに進んでいくと、あらゆる種類の元に戻すワークフローが可能になります。

基本的に、通常のアクセサー/ミューテーターのペアでフォームをカプセル化する2つのBeanがあります。次に、コントローラーで、1つ(xまたはy)のみを公開します。これが「フォームBean」です。yでは、リポジトリから取得した元のコピーを保存します。これにより、ページをリロードしたり、リポジトリから完全なデータリマーシャルを実行したりすることなく、フィールドレベルまたはBeanレベルの復帰を実行できます。

だから、単純に:

  • フォームをカプセル化するための2つのBean(フォームにマップされている場合は、エンティティを再利用できる場合もあります)。
  • データマーシャル中にリポジトリから両方を入力します
  • ファセットでユーザーに公開する
  • フィールドまたはフォーム全体をリセット/元に戻すためのバックアップとして2番目を保持します

「元に戻す」猫の皮を剥ぐ方法は他にもありますが、これは別の方法にすぎません。

于 2012-07-31T17:51:03.570 に答える