我对表单中的引用有问题。在相同的形式中,我有一个- 用标签生成的表- 一个面板,允许用户编辑单元格内容(具有多个输入和信息(
我使用带有<f:setPropertyActionListener>
的<p:commandButton>
来存储单元格值并刷新详细信息的面板。这部分没问题。
当用户的编辑结束时,他通过单击详细信息面板中的"保存"按钮来保存其更改。我只想刷新以前选择的单元格,而不是整个表格。所以我有一个保存 Component.clientId 并在按钮上放一个"renderer=xxx"以确保 id 不为空。
但它总是抛出javax.faces.FacesException...
<table class="measureTable" id="measureTable">
<!-- header -->
<tbody ... >
<tr class="ui-column-title">
<th ...> ...</th>
<ui:repeat var="columnHeader" value="#{managedBean.columnModels}" id="columnHeaders" >
<th ><p:outputLabel value="#{columnHeader.name}" /></th>
</ui:repeat>
</tr>
<!-- datas -->
<ui:repeat var="vLine" value="#{managedBean.roundvLines}" id="lines" >
<tr>
<td >
<p:panel styleClass="cellPanel">
<p:outputLabel value="#{vLine.id}" styleClass="ui-column-header" />
</p:panel>
</td>
<ui:repeat var="vCell" value="#{vLine.cells}" id="cells">
<td>
<p:commandButton styleClass="cellPanel" value="#{vCell.value}" update=":formControl:detailPanel" >
<f:setPropertyActionListener value="#{vCell}" target="#{managedBean.currentCell}" />
<f:setPropertyActionListener value="#{component.clientId}" target="#{managedBean.currentComponentId}" />
</p:commandButton>
</td>
</ui:repeat>
</tr>
</ui:repeat>
</tbody>
</table>
<p:panel id="detailPanel">
<p:panel rendered="#{!empty managedBean.currentCell}" styleClass="panelWithoutBorder">
<ui:param name="definition" value="#{managedBean.currentCell.measureDefinition}"/>
<ui:param name="measure" value="#{managedBean.currentCell}"/>
<p:panel id="detailValue" header="Valeur">
<!-- NUM -->
<p:keyboard value="#{measure.value}" keypadOnly="true"
rendered="#{definition.codeTypeSais == 1}" />
<!-- STR -->
<p:keyboard value="#{measure.value}"
rendered="#{definition.codeTypeSais == 2}"/>
...
</p:panel>
...
<p:panel>
<p:commandButton value="refresh" update=":formControl:specimen:0"
rendered="#{!empty managedBean.currentComponentId}"></p:commandButton>
</p:panel>
</p:panel>
</p:panel>
GRAVE:javax.faces.FacesException:找不到从"j_idt36"引用的表达式":formControl:lines:0:cells:0:j_idt20"的组件。 at org.primefaces.expression.SearchExpressionFacade.resolveComponentInternal(SearchExpressionFacade.java:422( at org.primefaces.expression.SearchExpressionFacade.resolveComponentForClient(SearchExpressionFacade.java:200( at org.primefaces.expression.SearchExpressionFacade.resolveComponentsForClient(SearchExpressionFacade.java:147( at org.primefaces.util.AjaxRequestBuilder.addExpressions(AjaxRequestBuilder.java:92( at org.primefaces.util.AjaxRequestBuilder.update(AjaxRequestBuilder.java:85( at org.primefaces.renderkit.CoreRenderer.buildAjaxRequest(CoreRenderer.java:356( at org.primefaces.component.commandbutton.CommandButtonRenderer.buildRequest(CommandButtonRenderer.java:123( ...
我已准备好阅读以下主题:
use-an-el-expression-to-pass-a-component-id-to-a-composite-component-in-jsf
如何找出 ajax 更新/渲染组件的客户端 ID?找不到从"bar"引用表达式"foo"的组件
我不能使用绑定,因为组件是自动生成的,而且太多了。
该组件已存在,因为页面未更改。我也尝试只更新顶部/左侧单元格,使用堆栈跟踪给出的 id 但仍然抛出异常。它仅在我更新整个表单时有效(update=":formControl"(... :S
我该如何解决?
PS:我使用了素数,但最终终端是一个带有默认浏览器的老公司 android 2.3.4,很多东西都不起作用,所以我必须手动完成。
两周前我在PrimeFaces中修复了这个问题,并对SearchExpressionFramework进行了其他一些改进。请尝试主干构建 - 如果它不起作用,请创建一个问题 + 完整示例。