5

ap:ajax タグを使用しようとしていて、そのリスナーで「periodRendered」という値を設定しています。次に、p:ajax タグからの更新を介して h:outputLabel タグを更新しようとしています。それはajaxlyを更新していません.primefaces ajaxタグが標準のjsf outputLabelタグを更新できないためだと思います。

私の仮定は正しいですか? h:outputLabel の代わりに使用すべきより適切なタグはありますか?

<h:outputLabel for="addProgramTo" value="Add Program To" />
<p:selectOneMenu value="#{ppBacker.grantProgram.grant_project_id}" id="addProgramTo" size="1" styleClass="listBoxMedium">
    <p:ajax process=":addProgram:addProgramTo" update=":addProgram:periodGrid, :addProgram:periodLabel" event="change" listener="#{ppBacker.addProgramListener}" />
    <f:selectItems value="#{ppBacker.grantProjectDropDownList}" />
</p:selectOneMenu>            

<h:outputLabel for="period" value="Period" id="periodLabel" rendered="#{ppBacker.periodRendered}"> 
4

2 に答える 2

10

レンダリングされていない要素を更新することはできませんrendered=false。DOM ツリーから要素を削除するための「JSF の方法です」。

cssdisplay:nonevisibility:hidden <- とは異なり、この 2 つは要素を DOM ツリーに保持しますが、非表示にしますが、JSFrendered=falseは要素を DOM ツリーにレンダリング (保持) することさえしません (ページの「ソースの表示」にも表示されません)。 )

outputLabelしたがって、 「panelGroup」でラップし、ラッパーのIDを更新する必要がある場合

<h:panelGroup id="periodLabelWrapper">
    <h:outputLabel for="period" value="Period" id="periodLabel" rendered="#{ppBacker.periodRendered}">
</h:panelGroup>

<p:ajax update次のように、属性でラッパー (常に DOM ツリーにあります) id を参照します。

<p:ajax process=":addProgram:addProgramTo" update=":addProgram:periodGrid, :addProgram:periodLabelWrapper" event="change" listener="#{ppBacker.addProgramListener}" />

別の解決策は、フォーム全体をこのように更新して<p:ajax update="@form" ...、ラップを必要としないようにすることですoutputLabel

コメントの質問について

@form はレンダリングされていない要素をどのように更新しますが、id を介してそれらを直接ターゲットにすることはできませんか?

updateページに存在しない要素 (rendered=false) をターゲットにすることはできません。

しかし、フォーム/ラッパーを使用するupdate="@form"update="someWrapperID"、フォーム/ラッパーを「再評価」すると、その要素を含むすべての内部要素rendered="#{someBean.someCondition}"が「再評価」され、条件が「再評価」されるためtrue、要素に結果が表示される場合...

于 2012-04-29T06:41:42.137 に答える
1

この動作の理由はわかりませんが、p:ajaxが更新を機能させるためにアクティブなターゲットを必要とするという事実にお金をかけています。動作する/動作しない例を次に示します。

<h:body styleClass="center">
    <f:view contentType="text/html">
        <h:form id="test">
            <h:outputLabel for="addProgramTo" value="Add Program To: " />
            <h:selectOneMenu id="addProgramTo" value="#{testScope.target}">
            <p:ajax update=":test:periodLabel, :test:wrapper" event="change" process="@form">
            </p:ajax>
            <f:selectItems value="#{testScope.values}"/>
            </h:selectOneMenu>            
            <hr />
            <p:outputPanel id="wrapper">
                <h:outputLabel value="Works, has a target" rendered="#{testScope.timeToRender}"/>
            </p:outputPanel>
            <hr />
            <h:outputLabel value="does not work" id="periodLabel" rendered="#{testScope.timeToRender}" />   
        </h:form>
    </f:view>

</h:body>

//豆...

@ViewScoped
@ManagedBean(name = "testScope")
public class TestScope
{
    private String[] values = { "False", "What?", "True" };
    private String target = "Nothing";

    /**
     * @return the target
     */
    public String getTarget()
    {
        return target;
    }

    /**
     * @return the values
     */
    public String[] getValues()
    {
        System.out.println(values);
        return values;
    }

    public boolean isTimeToRender()
    {
        return "True".equals(target);
    }

    /**
     * @param target the target to set
     */
    public void setTarget(String target)
    {
        this.target = target;
    }
}

これを掘り下げる時間はありませんが、デバッガーをざっと見てみると(ここでもQUICK)、IDが見つからない(レンダリングされていない)ため、更新が取得されないようです。 。なんで?よくわかりません。簡単な回避策は、更新可能なもの(p:outputPanel)内に配置し、スパンとしてレンダリングすることです。そうすれば、コードが機能するはずです。これは受け入れられますか?あまり...

完全なフォームの更新を処理できる場合は、以下も機能します->

<p:ajax update=":test" event="change" process="@form">

同封のフォームをターゲットにしているため、すべての子が更新されます。私がこれを行っていた場合、それが私が使用する回避策です。それは多くのデータではなく、非常にクリーンです。これがバグなのか機能なのかわかりません。でもバグだらけです。

簡単な答え:はい、ラベルをターゲットにすることができます。長い答え:レンダリングされていないものをターゲットにすることはできません。これがお役に立てば幸いです。

于 2012-04-27T22:11:17.883 に答える