如何对组件进行条件更新

时间:2013-12-09 14:59:25

标签: jsf primefaces composite-component

我有一个JSF复合组件,它只根据传递给它的属性cc.attrs.list呈现一些部分。 在其中一个组件中,我想根据属性更新一组其他组件。所以像这样:

<p:ajax event="dialogReturn" listener="#{cc.listener}" 
update="#{cc.attrs.id2}_input #{cc.attrs.id2}_resultTable"/>

问题是resultTable没有一直呈现,当resultTable不存在时,我得到一个异常Cannot find component with expression "id_resultTable",这并不奇怪。所以我的想法是创建一个变量,它将包含属性的id或空字符串,如下所示:

<c:if test="#{cc.attrs.list}">
    <ui:param name="updateTable" value="#{cc.attrs.id2}_resultTable"/>
</c:if>
<c:otherwise>
    <ui:param name="updateTable" value=""/>
</c:otherwise>

然后像这样执行ajax更新:

 <p:ajax event="dialogReturn" listener="#{cc.listener}" 
update="#{cc.attrs.id2}_input #{updateTable}"/>

问题是,#{updateTable}变量总是一个空字符串(我试图把它作为outputText的内容),我不知道为什么。

2 个答案:

答案 0 :(得分:1)

您可以省略ui:param并直接在p:ajax中进行检查:

<p:ajax event="dialogReturn" listener="#{cc.listener}" 
update="#{cc.attrs.id2}_input #{cc.attrs.list ? cc.attrs.id2.concat('_resultTable') : ''}"/>

c:if - 方法的问题可能是,当您通过ajax更新此部分时,不会重新检查条件,因为在视图构建时评估JSTL标记。有关详细信息,请查看JSTL in JSF2 Facelets... makes sense?

答案 1 :(得分:0)

这不是一个真正的解决方案,但我已经针对可行的问题做了一个解决方法。我在表格周围添加了h:panelGroup ID,我正在更新此而不是表格。