jsf:更新组件(表单元格<->详细信息面板)=> javax.faces.Faces异常:找不到带有表达式的组件



我对表单中的引用有问题。在相同的形式中,我有一个- 用标签生成的表- 一个面板,允许用户编辑单元格内容(具有多个输入和信息(

我使用带有<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进行了其他一些改进。请尝试主干构建 - 如果它不起作用,请创建一个问题 + 完整示例。

最新更新