検証に失敗した最初の UIINput にフォーカスを設定できる複合コンポーネントを作成しようとしています。
私の問題は、PROCESS_VALIDATIONS 中に更新しているインスタンスを単純にエンコードするのではなく、RENDER_RESPONSE が xhtml から複合コンポーネントを再作成していることです。Mojarra 2.0.4 (FCS b09) を使用しています
複合実装は
<h:outputScript name="jfocus.js" library="js" target="head"/>
<h:panelGroup layout="span" id="jimo-FocusMgr">
<script type="text/javascript">
jimo.FocusMgr.request("#{cc.attrs.target}");
</script>
</h:panelGroup>
私のリスナーの次のコードは、After PhaseId.PROCESS_VALIDATIONS 中にコンポジットのターゲット属性を設定し、コンポジットの (唯一の) 子を renderIds のリストに追加するものです。デバッグ出力は、prevEntry が使用中のページがコンポーネントに設定した値であり、failedId が無効な UIInput の clientId() であることを示しています。
//set the target attribute of the composite component
Object prevEntry = mgr.getAttributes().put("target", failedId);
if(log.isDebugEnabled())
log.debug("Set mgr's target attribute='"+failedId
+"', previously='"+(prevEntry==null ? "null" : prevEntry.toString()+"'"));
PartialViewContext pvc = fc.getPartialViewContext();
Collection<String> renderids = pvc.getRenderIds();
//update target has to be an official component in the DOM, so append the child panelGroup ID
if(!renderids.contains(mgr.getClientId()))
pvc.getRenderIds().add(mgr.getClientId()+UINamingContainer.getSeparatorChar(fc)+MGR_ID);
//first invalid component wins
break;
PhaseId.RENDER_RESPONSE の前に mgr.getAttributes().get("target") を呼び出すと、失敗した ID が引き続き表示されますが、PhaseId.RENDER_RESPONSE の後に同じ呼び出しを行うと、ターゲットが使用中のページの値に戻ったことが示されます。
これはバグですか、それともコンポジットを悪用/誤用していますか?
任意のポインタをいただければ幸いです
ジム