36

フォームを作成しましたが、新しいアイテムの作成中にテーブルに以前の既存のアイテムを表示したいと考えています。フォームがいっぱいになると、一致するアイテムを表示したいと思います。しかし、フォームに入力せずにリストをフィルタリングしようとすると、検証メッセージが表示され、テーブルが更新されません。

それが可能かどうかはわかりませんが、次のようなことをしたいのです:

<h:form id="form">

    <h:outputText value="Name: "/>
    <p:inputText value="#{itemsBean.name}" id="name" required="true"/>
    <br/>
    <h:outputText value="Description: "/>
    <p:inputText value="#{itemsBean.description}" id="description" required="true"/>

    <p:commandButton value="Save" update="form" actionListener="#{itemsBean.save}"/> //validate and save
    <p:commandButton value="Filter" update="form" actionListener="#{itemsBean.updateItemsList}"/> //don't validate, and update the table.

    <p:dataTable id="list" value="#{itemsBean.itemsList}" var="item">     
        <p:column>
            <h:outputText value="#{item.name}"/>
        </p:column>
        <p:column>
            <h:outputText value="#{item.description}"/>
        </p:column>
    </p:dataTable>

</h:form>

私はJSFに非常に慣れていません。

4

4 に答える 4

66

name入力フィールドに基づいてフィルタリングしたいことを理解しています。は<p:commandButton>デフォルトで ajax リクエストを送信しprocess、送信中に処理するコンポーネントを指定できる属性を持っています。特定のケースでは、入力フィールドと現在のボタンのみnameを処理する必要があります(そのアクションが呼び出されるように)。

<p:commandButton process="@this name" ... />

このprocess属性は、現在のコンポーネントを参照するコンポーネントの (相対) クライアント ID のスペース区切りのコレクションを取ることができ@thisます。<p:commandButton>toの場合 (現在のフォームと押されたボタンのすべての入力フィールドをカバーします)の場合はデフォルトです@form。そのため、最初の試行ですべてが検証されました。上記の例では、他のすべての入力フィールドは処理されません (したがって、検証もされません)。

ただし、問題のボタンが押されるたびにすべてのrequiredフィールドの検証をスキップする場合は、必ずしもすべて入力する必要のない複数のフィールドを最終的に処理できるようにするには、代わりに条件付きにする必要があります。ボタンが押されたかどうかをチェックします。たとえば、保存ボタンが押されたときにのみ評価するようにします。required="true"true

<p:inputText ... required="#{not empty param[save.clientId]}" />
...
<p:inputText ... required="#{not empty param[save.clientId]}" />
...
<p:commandButton binding="#{save}" value="Save" ... />

required="true"この方法では、別のボタンが押されたときのように検証されません。上記の例の秘訣は、押されたボタンの名前 (基本的にはクライアント ID) が要求パラメーターとして送信され、要求パラメーター マップでその存在を確認できることです。

以下も参照してください。

于 2011-12-03T22:58:19.733 に答える
9

非ajax送信でこ​​れをテストしました:

<p:inputText ... required="#{not empty param.includeInSave1}" />
...
<p:inputText ... required="true" />
...
<p:commandButton value="Save1" ajax="false">
  <f:param name="includeInSave1" value="true" />
</p:commandButton>

<p:commandButton value="Save2" ajax="false" />

最初の入力は、Save1 ボタンの送信時にのみ検証する必要があります。

于 2014-08-09T14:38:22.573 に答える
2

検証を無視するには、フィルターコマンドボタンを次のように変更します。

<p:commandButton value="Filter" update="list" actionListener="#{itemsBean.updateItemsList}" process="@this"/>

編集:

SOの関連記事、これであなたの問題も解決すると思います

JSF 2.0:JSR-303 Bean Validationをスキップする方法は?

于 2011-12-03T20:25:38.420 に答える