0

私は ah:selectOneMenu を持っており、その値が特定の値 (「2」など) に変化すると、(レンダリングされていない) 非表示のフィールドを表示することを想定しています。これらは、マネージド Bean のプロパティの同じ値にリンクされていることに注意してください。

<h:outputText value="Function:"></h:outputText>
<h:selectOneMenu id="funDrp" converter="FunctionConv" value="#{cardBean.card.functionId}">
    <f:selectItems value="#{commonData.functions}" var="c" itemLabel="#{c.description}" itemValue="#{c.functionId}" />
    <f:ajax render="@form" execute="@form" event="valueChange" />
</h:selectOneMenu>

<h:outputText value=" Profile Id:" rendered="#{(cardBean.card.functionId.functionId==2)}"></h:outputText>
<h:inputText id="card_refillProfileId"rendered="#{(cardBean.card.functionId.functionId==2)}" label="Refill Profile Id" required="true" value="#{cardBean.card.refillProfileId}"></h:inputText>

<h:outputText value="Origin Type:" rendered="#{(cardBean.card.functionId.functionId==2)}"></h:outputText>
<h:inputText id="card_originType" rendered="#{(cardBean.card.functionId.functionId==2)}" label="Origin Node Type" required="true" value="#{cardBean.card.originType}"></h:inputText>

「カード」オブジェクトが既存のエンティティに割り当てられている場合は正常に機能しますが、新しいエンティティの場合は期待どおりに機能しません。

4

4 に答える 4

0

これは完全に予想される動作です。を使用<f:ajax>すると、DOMに存在するHTML要素を再レンダリングできますがrendered="false"、JSFコンポーネントで指定することにより、それらはDOMに表示されません。また、ajaxは要素をそのIDで検索し、後で置き換える必要があるため、この作業は明らかに実行できません。

ただし、あなたの仕事は、コンポーネント(すべてrendered属性を使用する)をコンテナに含めることで処理できます。たとえば、<h:panelGroup id="to-be-rerendered">常にレンダリングされますが、その子はそうではありません。したがって、ajaxはrendered="true"、条件が満たされた場合にすべてのコンポーネントを含むパネルを再レンダリングすることができ、それらがビューに表示されます。

ちなみに、ビュー/フォームが大きくなると、ajaxの動作は非常に高くつく可能性があります。したがって、一部の<f:ajax>コンポーネントを再レンダリングするだけの場合は、タグでそれを指定します:(<f:ajax render="to-be-rerendered" />レンダリングされるコンポーネントのスペースで区切られたIDのリスト)。

于 2013-02-21T11:58:15.760 に答える
0

問題は、選択したメニューに添付された値がnullの「card.functionId」であったため、チェックする直前に初期化していたため、Beanを構築する前に初期化しようとしましたが、役に立ちませんでした。

そうするために、selectOneMenuに「ValueChangeListener」を付けて初期化しました

<h:selectOneMenu id="funDrp" converter="FunctionConv" valueChangeListener="#     {cardBean.changeCardFunc}"
                                            value="#{cardBean.card.functionId}">
                                            <f:selectItems value="#{commonData.functions}" var="c"
                                            itemLabel="#{c.description}" itemValue="#{c.functionId}" />
                                            <f:ajax render="@form" execute="funDrp" event="change" />
                                          </h:selectOneMenu>

および管理対象 Bean で:

public void changeCardFunc(ValueChangeEvent e) {
//  object newFunc= e.

    if(card!=null){
    card.setFunctionId((Function)e.getNewValue());
    }else {
        card= new Card();
        card.setFunctionId((Function)e.getNewValue());
        System.err.println(e.getNewValue());
    }
}
于 2013-02-21T23:13:14.907 に答える
-1

君の

<f:ajax render="@form" execute="@form" event="valueChange" />

べき(イベントは省略可)

<f:ajax render="@form" execute="@form" event="change" />

selectOneMenu.value、コンバーター、およびレンダリングされた EL の間に不一致があるようです。2回ありfunctionId.functionIdます。そしてselectOneMenu.valueにバインドされcardBean.card.functionIdます。関数の場合functionIdは間違っている可能性があります。

于 2013-02-21T09:45:22.617 に答える
-1

試す

<f:ajax render="card_refillProfileId card_originType" execute="@form" event="valueChange" />
于 2013-02-21T09:40:20.280 に答える