0

検証に失敗した最初の 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 の後に同じ呼び出しを行うと、ターゲットが使用中のページの値に戻ったことが示されます。

これはバグですか、それともコンポジットを悪用/誤用していますか?

任意のポインタをいただければ幸いです

ジム

4

1 に答える 1

0

複合虐待。

cc.attrs 値をプログラムで変更することはできません。NamingContainer UIComponent 属性マップを使用して取得されません。

実装を微調整して、cc.attr が c:set を使用して複合 xhtml で初期化する managedBean プロパティを参照するようにし、setter を介してリスナーで自由に更新できるようにしました。

于 2011-03-21T16:58:12.893 に答える