我有这样的代码:
<p:outputPanel id="conditionalPanel">
<p:panel rendered="#{object.category.string == 'foo'}">
<ui:param name="foo" value="#{object}"/>
<h:panelGrid columns="3" id="fooAssignmentsuttonGrid">
<h:outputLabel for="barToAdd" styleClass="desc" value="#{foobarzooUIData.label}"/>
<h:selectOneMenu id="barToAdd" value="#{fooController.barToAdd}">
<f:selectItems value="#{barsToAddAssignments}"
var="foobarzoo" itemValue="#{foobarzoo}"
itemLabel="#{foobarzooUIData.buildLabelForObject(foobarzoo)}"/>
</h:selectOneMenu>
<p:commandButton value="#{text['button.add']}" process="@this barToAdd"
update="assignmentDetail" disabled="#{empty barsToAddAssignments}"
action="#{fooController.createNewAssignment(foo)}">
</p:commandButton>
</h:panelGrid>
<p:outputPanel id="fooAssignmentsTable">
<p:dataTable value="#{utils:toList(foo.fooAssignments)}" var="assignment">
<!-- p:columns here etc..-->
</p:dataTable>
</p:outputPanel>
<p:outputPanel id="assignmentDetail">
<p:panel rendered="#{not empty fooController.selectedAssignment}" style="margin-top: 30px;">
<h:panelGrid id="assignmentDetailForm" styleClass="formsTable" columns="2">
<!-- Some kick ass code here -->
</h:panelGrid>
</p:panel>
</p:outputPanel>
</p:panel>
</p:outputPanel>
问题是,当我点击此页面时
object.category.string == 'foo'
不满意,我还是得到了:
/test.xhtml @264,147 value="#{utils:toList(foo.fooAssignments)}": The class 'com.foo.bar.too does not have the property 'fooAssignments'.
是的,我知道这个类没有这个属性,但是根本不应该对它进行评估,不是吗?
我在这里缺少什么?
答案 0 :(得分:1)
很遗憾,你没有发布完整的堆栈跟踪,因为这通常代表了我自己的整个答案,我可以将其转化为外行人的条款。
通常这会在component tree visit not obeyed期间发生,rendered
属性为PropertyNotFoundException on conditionally rendered subclasses in ui:repeat。提到堆栈跟踪和正在使用的实际版本应该揭示它是否是一个&#34;功能&#34;或实际上是在使用的JSF impl或PrimeFaces中的错误。一般来说,我会说这会是一个错误。以前在Mojarra的<ui:repeat>
中观察到了这个问题,并且已经在这方面得到了解决。另请参阅此相关问答:JSTL in JSF2 Facelets... makes sense?。
如果升级到最新的JSF impl和PrimeFaces版本没有帮助,那么最好的办法是有条件地构建视图而不是有条件地渲染视图。 JSTL对此非常有帮助。另请参阅{{3}}
<c:if test="#{object.category.string == 'foo'}">
<p:panel>
...
</p:panel>
</c:if>