ビューに、Bean から更新したいコンポーネントがあります。
一度だけ機能します。2 番目のボタンを押しても何も起こりませんが、actionlistener の Bean メソッドが呼び出されました。
firebug を使用してブラウザのログを確認しましたが、エラーや奇妙に見えるものはありません。
私の Bean は ViewScope にあります。私はprimefaces 3.5を使用しています。
JSFPページ:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:body>
<h:form id="myRootForm">
<p:inputText id="text1" styleClass="myChangeClass" disabled="true" />
</h:form>
<h:form>
<p:commandButton value="Activate Insert"
actionListener="#{controller.activate()}" update=":myRootForm" />
<p:commandButton value="Deactivate"
actionListener="#{controller.resetFields()}" update=":myRootForm" />
</h:form>
</h:body>
</html>
これは EJB コードです。
import javax.faces.component.UIViewRoot;
import javax.faces.component.html.HtmlInputText;
import javax.faces.context.FacesContext;
import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.ViewAccessScoped;
import java.io.Serializable;
import javax.inject.Named;
@ViewAccessScoped
@Named("controller")
public class Controller {
private UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
public void activate() {
HtmlInputText text = (HtmlInputText)
viewRoot.findComponent("myRootForm:text1");
text.setDisabled(false);
RequestContext.getCurrentInstance().update(text.getClientId());
}
public void deactivate() {
HtmlInputText text = (HtmlInputText)
viewRoot.findComponent("myRootForm:text1");
text.setDisabled(true);
RequestContext.getCurrentInstance().update(text.getClientId());
}
}
** アップデート:
例を少し読みやすくしました。「RequestScope」を使用しているときは機能していますが、情報を保持するにはviewScopeが必要です。
なぜこのようにしたいのかをよりよく理解するために、いくつかのモードで利用できるようにしたいいくつかの入力コンポーネントがあります。モードは StyleClass (つまり、myChangeClass) で示されます。ボタンを押すと、フォームのコンポーネントツリーを調べてスタイルクラスを検索し、ボタンをアクティブにします。コンポーネントごとに Bean の属性を保持して、これを行いたくありません。