ajaxify 複合コンポーネントに従って多くのエントリを読み、私の間違いを見つけることができなかった場合、ajax リクエストが送信されません。たぶん、他の誰かがそれを見つけることができました。
宣言する複合コンポーネントはcomponent.xhtml
次のようになります
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<composite:interface componentType="myComponentType">
<composite:attribute name="ajaxListener" method-signature="void listener(javax.faces.event.AjaxBehaviorEvent)" required="false"/>
<composite:clientBehavior name="update" event="click" targets="#{cc.clientId}:submit"/>
</composite:interface>
<composite:implementation>
<h:form id="form" prependId="false">
<h:panelGroup layout="block" id="#{cc.clientId}-body">
<h:commandButton type="submit" id="submit" value="Send"/>
</h:panelGroup>
</h:form>
</composite:implementation>
</html>
そして、このコンポーネントを次のように使用します
<h:panelGroup id="viewport" layout="block" binding="#{controller.viewport}">
...
<c:forEach items="#{controller.elements}" var="element">
<my:component id="#{element.id}">
<f:ajax event="update" listener="#{controller.update}" render="@form"/>
</my:component>
... rendering some different components by element.type what requires JSTL c:forEach/c:if
</c:forEach>
</h:panelGroup>
submit
私の具体的な問題は、ボタンをクリックしてもページがリロードされたときに FireBug が ajax リクエストをキャッチしないことです。そのため、ajax イベントが送信ボタンに正しくバインドされていませんでした。
初めてf:ajax
複合コンポーネント内で宣言してこれを試しました。したがって、属性を使用しますajaxListener
。これは機能しますがupdate
、署名付きのメソッドvoid update(AjaxBehaviorEvent e)
はトリガーされません。
うまくいけば、誰でも間違いを特定できます!
アップデート
私の問題はh:panelGroup
、JSTL タグc:forEach
とを使用して 内で複合コンポーネントをレンダリングする方法ですc:if
。これらのタグを省略して静的複合コンポーネントを挿入すると、ajaxListener
-attribute 内のリスナー メソッドがトリガーされ、ajax リクエストが正しく送信されます。上記の方法はとにかく機能しません。
リビジョン 2 を更新
おそらく、ajax リスナーが正しくバインドされない理由を説明できる人はいるでしょうか?!
前もって感謝します!