この JSF1 コードは、私を何時間も完全に困惑させました。基本的なセットアップは、Seam2 で表示されるこのページです。
<h:form encType="multipart/form-data">
<rich:dataTable value="#{results}">
...
</rich:dataTable>
<h:selectOneMenu value="#{contact.type}">
<s:selectItems value="#{contactTypes}" var="t" label="#{t.label}" />
<s:convertEntity />
<a4j:support event="onchange" reRender="submitControls" />
</h:selectOneMenu>
<h:selectOneMenu value="#{template}">
<s:selectItems value="#{allTemplates}" var="t" label="#{t.label}" />
<s:convertEntity />
<a4j:support event="onchange" reRender="submitControls" />
</h:selectOneMenu>
<a4j:outputPanel id="submitControls" layout="block">
<a4j:outputPanel rendered="#{null != results and results.size gt 0 and ('ONE' == contact.type.label or template != null)}">
<h:commandButton value="submit" action="#{manager.generate}" />
</a4j:outputPanel>
<h:outputText value="Search first" rendered="#{results == null or results.size == 0}" />
<h:outputText value="Select template first" rendered="#{'ONE' == contact.type.label and template == null}" />
</a4j:outputPanel>
</h:form>
明らかに、元のページは少し大きくなっています。頭を悩ませているのは、変更しない場合contact.type
(バッキング Bean によって選択されたデフォルトのままにしておく場合)、フォームが正常に送信されることです。タイプをこれに切り替えるONE
と、送信コントロールの代わりに「最初にテンプレートを選択」テキストが正しくレンダリングされます。別のタイプを選択して送信ボタンを復元すると、フォームが最初にレンダリングされたときに存在したハンドラー<input>
なしで BUT が再生成されます。onclick
をクリックする<h:commandButton>
と、サーバーにリクエストが送信されますが、関連するアクションはトリガーされません。ただし、onclick ハンドラーが復元され、2 回目のクリックで適切な送信がトリガーされるようになりました。
どうしてこうなるのか途方に暮れています。助言がありますか?
編集:rendered
属性をボタンに移動すると、同じ動作になります (たとえそれが機能したとしても、元のパネルには同じ条件を共有するより多くのコントロールが含まれているため、目的を果たします)
onclick
EDIT2:送信ボタンでレンダリングされる「失われた」ハンドラーを(firebugを介して)再追加するだけで、アクションが意図したとおりに機能することをテストしました。リッチフェイスと、このプロジェクトにも含まれているトリニダード ライブラリ (ただし、このページでは使用されていません) との間の不適切な相互作用が疑われ始めています。