下面的代码是从PrimeFaces的DataGrid + DataTable的教程启发和放入<p:tab>一个的<p:tabView>居住在<p:layoutUnit>的<p:layout>.这是代码的内部部分(从p:tab组件开始); 外部是微不足道的.
<p:tabView id="tabs">
<p:tab id="search" title="Search">
<h:form id="insTable">
<p:dataTable id="table" var="lndInstrument" value="#{instrumentBean.instruments}">
<p:column>
<p:commandLink id="select" update="insTable:display" oncomplete="dlg.show()">
<f:setPropertyActionListener value="#{lndInstrument}"
target="#{instrumentBean.selectedInstrument}" />
<h:outputText value="#{lndInstrument.name}" />
</p:commandLink>
</p:column>
</p:dataTable>
<p:dialog id="dlg" modal="true" widgetVar="dlg">
<h:panelGrid id="display">
<h:outputText value="Name:" />
<h:outputText value="#{instrumentBean.selectedInstrument.name}" />
</h:panelGrid>
</p:dialog>
</h:form>
</p:tab>
</p:tabView>
Run Code Online (Sandbox Code Playgroud)
当我单击时<p:commandLink>,代码停止工作并给出消息:
找不到表达式为"insTable:display"的组件,引用自"tabs:insTable:select".
当我尝试相同的使用时<f:ajax>,它失败了,基本上告诉相同的不同消息:
<f:ajax>包含一个未知的id"insTable:display"无法在组件"tabs:insTable:select"的上下文中找到它
这是怎么造成的,我该如何解决?
所以我找到了一些接近这个的答案,我发现足以解决我遇到的问题.但即使这样,我也很好奇了解这方面的运作方式.让我用一个例子来说明:
我有一个.xhtml看起来像这样(缩短)的facelet 页面.
<h:form id="resultForm">
<h:panelGroup class="search_form" layout="block">
<h:inputText id="lastname" value="#{search.lastname}"/>
<h:commandButton action="#{search.find}" value="Find">
<f:ajax execute="lastname" render="resultDisplay"/>
</h:commandButton>
</h:panelGroup>
<h:dataTable value="#{search.searchResults}" var="results" id="resultDisplay"
rendered="#{!empty search.searchResults}">
<h:column>
#{results.field}
</h:column>
</h:dataTable>
</h:form>
Run Code Online (Sandbox Code Playgroud)
现在,为了突破性,我不会发布所有的支持bean代码,但我有这样的东西:
public void find() {
searchResults = setResults(true);
}
Run Code Online (Sandbox Code Playgroud)
哪里searchResults是ArrayList<Objects>.在搜索之后,它不是null - 在多个测试中检查(可以为null,但不在我正在进行的测试中).
现在.这不起作用.
但是,如果我将dataTable内部嵌套在另一个内部panelGroup,那么它会起作用.
<h:panelGroup id="resultDisplay">
<h:dataTable value="#{search.searchResults}" var="results"
rendered="#{!empty search.searchResults}">
<h:column>
#{results.field}
</h:column>
</h:dataTable>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
现在,这种变化可以让一切正常.我对此感到满意......但我想我也在寻求一些理解.有关为什么我必须嵌套这些组件的任何见解?我肯定错过了一些东西!
我有一个与此线程中描述的类似问题:Show/hide JSF2 form using selectBooleanCheckbox。但该线程中提出的解决方案对我不起作用。我想要一个可以通过选中复选框来扩展的表单。
我的设置如下:
<p:selectBooleanCheckbox id="lookupCheck" value="#{addressDetailBean.addQLookup}">
<p:ajax event="change" update="qlookupcolumn1" process="@this"/>
</p:selectBooleanCheckbox>
<p:outputPanel id="qlookupcolumn1" rendered="#{addressDetailBean.addQLookup}">
<h2>#{msg['qloookup.new.title']}</h2>
<ui:include src="/WEB-INF/includes/integration/qlookupDetailColumns.xhtml">
<ui:param name="bean" value="#{addressDetailBean}" />
</ui:include>
</p:outputPanel>
Run Code Online (Sandbox Code Playgroud)
但是当我检查复选框表单时,未呈现。Bean 被调用并且属性被正确设置,我可以在响应中看到表单,但它没有呈现在页面上。
可能出了什么问题?