我不确定这种行为的原因,但我认为 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;
}
}
我没有时间深入研究这个,但是从调试器中的快速查看(再次快速)看来它没有找到 ID(它没有呈现)所以它没有得到更新. 为什么?我不确定——简单的解决方法是将它放在可以更新的东西(p:outputPanel)中并将其呈现为跨度,然后你的代码应该可以工作。这可以接受吗?并不真地...
如果您可以处理完整的表单更新,则以下内容也可以使用->
<p:ajax update=":test" event="change" process="@form">
由于您的目标是封闭表单,因此它会更新所有子表单。如果我这样做,那就是我会使用的解决方法。它不是很多数据,而且非常干净。我不确定这是错误还是功能。不过感觉很坑。
简短的回答:是的,您可以定位标签。长答案:您不能针对未渲染的目标。我真的希望这会有所帮助。