この動作の理由はわかりませんが、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">
同封のフォームをターゲットにしているため、すべての子が更新されます。私がこれを行っていた場合、それが私が使用する回避策です。それは多くのデータではなく、非常にクリーンです。これがバグなのか機能なのかわかりません。でもバグだらけです。
簡単な答え:はい、ラベルをターゲットにすることができます。長い答え:レンダリングされていないものをターゲットにすることはできません。これがお役に立てば幸いです。