1

ajaxを使用した検索フォームがあります。keyup検索フィールドのイベント中searchKeyFieldIdに、同じパネル グリッド内の他のすべてのフィールドを更新する必要があります。

<h:panelGrid id="myGrid" columns="4" >

    <!-- When searchKeyFieldId change ... -->
    <!-- Need to render all the myGrid EXCEPT searchKeyFieldId -->
    <h:outputText value="search key"/>
    <h:inputText id="searchKeyFieldId"
        value="#{MyController.searchKeyField}"      
        valueChangeListener="#{MyController.licenseNumberChange}" >
        <a4j:ajax event="keyup" render="myGrid" />
    </h:inputText>

    <h:outputText value=""/>
    <h:outputText value=""/>

    <!-- Target render fields -->   
    <h:outputText value="text1"/>
    <h:inputText id="field1"
        value="#{MyController.field1}"/>

    <h:outputText value="text2"/>
    <h:inputText id="field2"
        value="#{MyController.field2}"/>

    <h:outputText value="text3"/>
    <h:inputText id="field3"
        value="#{MyController.field3}"/>
    .....   
</h:panelGrid>  

ただし、 を使用するrender="myGrid"と、検索フィールドも更新されるため、フォーカスが失われます。入力を続けるには、エンドユーザーが入力フィールドをもう一度クリック/フォーカスする必要があります。

したがって、次のように特定のフィールドのみを更新する必要があります。

<a4j:ajax event="keyup" render="field1 field2 field3 field4 field5 ..." />

ただし、私には多くのフィールドがあり、正確には40個あります。このソリューションは適切な方法ではありません。

4

1 に答える 1

3

この解決策は良い習慣ではありません

申し訳ありませんが、これはばかげています。それはまさにあなたが望む仕事をするので、正しいアプローチです。それを乗り越えて、それらをすべて書き留めてください。必要に応じて、ボイラープレートを Bean プロパティの背後に隠すことができます。

render="#{MyController.clientIdsToRender}"

必要に応じて、JSF コンポーネント ツリーに基づいて文字列を自動入力できますが、そのコードを記述すると、ビューで既に定義されているクライアント ID をハードコーディングするために必要以上の文字数が必要になります。

標準の JSF にも RichFaces にも他の方法はありません。ただし、PrimeFaces は、 PrimeFaces Selector (PFS)のフレーバーで代替手段を提供します。この関連する質問も参照してください:親コンポーネントの ajax 更新で子コンポーネントを除外する方法は?

まったく別の方法は、パネル グリッドを 2 つのパネル グリッドに分割することです。一方には検索入力が含まれ、もう一方には更新されるフィールドが含まれます。必要に応じて、適切な CSS ショットでそれらを整列させることができます。

于 2013-04-17T14:42:09.143 に答える