jsf:update component(table cell< - > detail panel)=> javax.faces.FacesException:找不到带表达式的组件

时间:2014-12-08 18:50:10

标签: jsf jsf-2 primefaces

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

我使用<p:commandButton><f:setPropertyActionListener>来存储单元格值并刷新详细信息面板。这部分没问题。

当用户的编辑结束时,他通过点击&#34;保存&#34;来保存其更改。详细面板中的按钮。我只想刷新以前选择的单元格,而不是整个表格。 所以我有一个保存Component.clientId并放置一个&#34; renderer = xxx&#34;在按钮上确保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:找不到带表达式&#34;的组件:formControl:lines:0:cells:0:j_idt20&#34;引自&#34; j_idt36&#34;。       在org.primefaces.expression.SearchExpressionFacade.resolveComponentInternal(SearchExpressionFacade.java:422)       在org.primefaces.expression.SearchExpressionFacade.resolveComponentForClient(SearchExpressionFacade.java:200)       在org.primefaces.expression.SearchExpressionFacade.resolveComponentsForClient(SearchExpressionFacade.java:147)       at org.primefaces.util.AjaxRequestBuilder.addExpressions(AjaxRequestBuilder.java:92)       在org.primefaces.util.AjaxRequestBuilder.update(AjaxRequestBuilder.java:85)       在org.primefaces.renderkit.CoreRenderer.buildAjaxRequest(CoreRenderer.java:356)       在org.primefaces.component.commandbutton.CommandButtonRenderer.buildRequest(CommandButtonRenderer.java:123)   ...

我已经阅读了以下主题:

use-an-el-expression-to-pass-a-component-id-to-a-composite-component-in-jsf

How to find out client ID of component for ajax update/render? Cannot find component with expression "foo" referenced from "bar"

我无法使用绑定,因为组件是自动生成的,而且太多了。

组件已经存在,因为页面没有改变。 我试过只更新顶部/左侧单元格,使用堆栈跟踪的id gaven,但仍然抛出异常。 它仅在我更新整个表单时有效(update =&#34;:formControl&#34;)...:S

我该如何解决?

PS:我使用的是primefaces,但最终终端是一个老公司android 2.3.4,默认浏览器,很多东西都没有用,所以我必须手动完成。

1 个答案:

答案 0 :(得分:0)

我在2周前在PrimeFaces中解决了这个问题,并对SearchExpressionFramework进行了一些其他改进。 请尝试后备箱构建 - 如果它不起作用,请创建一个问题请+完整示例。