ui:repeatの中のf:ajax

自分メモ。

ui:repeatの中でf:ajaxを使う場合、renderの指定の仕方に注意が必要です。

例えばui:repeatでボタンを配置し、自身を含む親タグ全体を再描画したい場合、

<f:ajax render=":f:list" />

のように根元からのパスを指定しないといけないようです。
頭の : を忘れるんですよね。。。

サンプル

f:ajaxが2ヶ所に出てきていますが、renderの指定の仕方がちがうことに注目。

<h:form id="f">
    <h:inputText value="#{employees.name}" />
    <h:commandButton value="追加" action="#{employees.insert(employees.name)}">
        <f:ajax render="list" />
    </h:commandButton>
    <hr/>
    <h:panelGroup id="list">
        <ul>
            <li jsfc="ui:repeat" value="#{employees.all}" var="e">
                #{e.id} : #{e.name} : 
                <h:commandButton action="#{employees.delete(e)}" value="削除">
                    <f:ajax render=":f:list" />
                </h:commandButton>
            </li>
        </ul>
    </h:panelGroup>
</h:form>

BK

上記サンプルにはちょっとしたバッドノウハウがあります。
ボタンを押したときにulタグ全体を再描画したいのですが、ul相当のFaceletsタグはありません。そこでh:panelGroupでulタグを囲みます。
こうするとspanタグでulタグが囲まれるので、これを再描画するようにしています。

カスタムタグを作ってもいいのですが、ま、これもアリでしょう。。。