0

ビューに、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 の属性を保持して、これを行いたくありません。

4

1 に答える 1

0

あなたが何を達成しようとしているのか正確にはわかりません。私はあなたを助けるために以下の例を追加しました.

XHTML コード

<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:head>
    <title>Test</title>
</h:head>

<h:body>

    <h:form id="myRootForm">
        <p:inputText id="text1" disabled="#{tBean.enabled}" />

        <p:commandButton value="Activate Insert"
            actionListener="#{tBean.enable}" update=":myRootForm" />
        <p:commandButton value="Deactivate" actionListener="#{tBean.disable}"
            update=":myRootForm" />
    </h:form>
</h:body>
</html>

ManagedBean コード

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

@ManagedBean(name = "tBean")
@ViewScoped
public class TestBean {

    private boolean enabled;

    public void enable(ActionEvent e) {
        enabled = false;
    }

    public void disable(ActionEvent e) {
        enabled = true;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }
}

上記を試して、それが役立つかどうかを確認してください。

于 2014-05-13T16:53:04.223 に答える