m:rendered内のm:action問題をJavaScriptで解決してみる

S2JSFはm:renderedを記載したタグスコープ内では、submmitにm:actionを記載してもアクションを実行してくれません。MLでも度々出ている話題ですね。原因はm:renderedとm:actionの評価するタイミングが異なるためで、オブジェクトを受け渡せないからみたいです。
解決方法として、sessionやhiddenを用いる方法があるそうですが、ここではJavaScriptを使って解決してみます。

ポイントはJavaScript with Kumuでアクションを呼び出します。
事前にTeedaに含まれるkumu.jsをインクルードしてください。

HTML

<form id="hogeAction">  ← idをつける

<input type="submit" value="登録" 
  m:rendered="#{mode == 'INSERT'}"  ← m:rendered部分 
  m:passthrough="true" ← passthroughを忘れないように。JavaScriptが呼べなくなります。 
  onclick="doAction('hogeAction','doInsert');" ← doAction(フォームのID、呼び出すAタグのID)
/> 
<a 
  id="doInsert" ← idをつける
  m:action="#{hogeAction.doInsert}" /> ← m:actionの実装(画面には表示されない)

</form>

JavaScript doActionの実装

function doAction(formId, linkId) {
	var f = $i(formId);
	f.target = '';
	f.elements[formId + ':__link_clicked__'].value = formId + ':' + linkId;
	f.submit();
	return false;
}