0

複合コンポーネントがあります

       <co:interface>
            <co:attribute name="editAction"     required="false"  targets="edit"   method-signature="java.lang.String f()"/>
            <co:attribute name="saveAction"     required="false"  targets="save"   method-signature="java.lang.String f()"/>
            <co:attribute name="isBrowseModus"  required="true"/>
            <co:attribute name="user"           required="true"/>
            <co:attribute name="editListener"   targets="edit" method-signature="void f(javax.faces.event.ActionEvent)" />
            <co:actionSource name="save"/>
        </co:interface>
        <co:implementation>
............
        <p:inplace id="inpLand" editor="true" 
            toggleable="#{not cc.attrs.isBrowseModus}" 
            style="#{cc.attrs.isBrowseModus ? 'color: black' : 'color: blue'}">  
                <p:inputText value="#{cc.attrs.user.land}" label="text"/>  
        </p:inplace>  
...........
        <c:if test="#{cc.attrs.isBrowseModus}">
           <p:commandButton id="edit" value="#{msgs.co_userdata_button_edit}" icon="ui-icon-unlocked" actionListener="#{cc.attrs.editListener}"/>
        </c:if>

実際には、この複合コンポーネントは、myData.xhtml を呼び出すビューによって呼び出されます。

    <h:form id="dataForm">  
        <mc:UserData user="#{dataBean.user}" 
               isBrowseModus="#{dataBean.browseModus}"
               saveAction="#{dataBean.save}" 
               editListener="#{dataBean.editActionListener}">
        </mc:UserData>   
    </h:form>  

私の目的は何ですか:その複合コンポーネント内で、ユーザーは「編集」ボタンをクリックしてユーザーデータを変更できます。PRIMEFACES の inplace タグを使用することを好みます。編集ボタンをクリックすると、変更可能なすべてのフィールドが青色で表示されます (複合コンポーネントを参照)。

私の問題は、 isBrowseModusフラグ (cc 属性として定義) を falseに更新する方法がわからないことです。実際にはeditActionListener (managedBean で定義) 内で実行しますが、残念ながら結果はありません。

管理対象 Bean (dataBean) からの抽出:

....
    public boolean isBrowseModus() {
        return browseModus;
    }

    public void setBrowseModus(boolean browseModus) {
        this.browseModus = browseModus;
    }


    public void editActionListener(ActionEvent event) {
        browseModus = false;
        FacesContext.getCurrentInstance().renderResponse();
    }
....

私は JSF に 1 か月前から取り組んでいるので、JSF にはあまり詳しくありません。おそらく、この結果を達成するためのより便利な方法があります。しかし、残念ながら方法がわかりません。この問題を解決するのを手伝ってくれる人はいますか?

よろしくお願いします。よろしく、ボードー

4

1 に答える 1

0

boolean 変数はデータによって渡されます。cc.attrs.isBrowseModus は databean の browseModus とは何の関係もありません。理想的な解決策は、参照が渡されるように Boolean オブジェクトを保持することですが、Java の Boolean ラッパーも不変であるため、commons-lang の MutableBoolean クラスなど、ブール値を保持するものを使用する必要があります。

<h:form id="dataForm">  
        <mc:UserData user="#{dataBean.user}" 
               isBrowseModus="#{dataBean.browseModus}"
               saveAction="#{dataBean.save}" 
               editListener="#{dataBean.editActionListener}">
        </mc:UserData>   
    </h:form>

...
 <p:inplace id="inpLand" editor="true" 
            toggleable="#{not cc.attrs.isBrowseModus.value}" 
            style="#{cc.attrs.isBrowseModus ? 'color: black' : 'color: blue'}">  
                <p:inputText value="#{cc.attrs.user.land}" label="text"/>  
        </p:inplace>  
...



....
MutableBoolean browseModus = new MutableBoolean();

    public MutableBoolean isBrowseModus() {
        return browseModus;
    }

    public void setBrowseModus(MutableBoolean browseModus) {
        this.browseModus = browseModus;
    }


    public void editActionListener(ActionEvent event) {
        browseModus.setValue(true);
        FacesContext.getCurrentInstance().renderResponse();
    }
....
于 2013-02-28T01:33:36.383 に答える