【问题标题】:JSF f:ajax cannot locate component on context [duplicate]JSF f:ajax无法在上下文中找到组件[重复]
【发布时间】:2011-12-01 18:30:26
【问题描述】:

我正在尝试从数据表中的图形图像更新一个数据表。我尝试了很多 f:ajax 渲染值的组合但没有成功,现在我正在使用 PrimeFaces 的 p:component 函数,但我之前得到了同样的错误。我在浏览器中收到此错误:

f:ajax 包含未知 id 'j_idt690:painelTabelaAPDespesa' - 无法在组件 j_idt735 的上下文中找到它

我用来刷新的代码:

<f:ajax event="click" render="#{p:component('painelTabelaAPDespesa')}"
                    listener="#{itensAPDespesa.removerItem(item)}" />

你如何能看到这个 f:ajax 在一个数据表中的图形图像中。

<h:panelGroup id="painelTabelaAPDespesa">
        <p:dataTable id="tabelaAPDespesa" value="#{itensAPDespesa.itens}"
            var="item">
            <p:column>
                #{itensAPDespesa.itens.indexOf(item)+1}
            </p:column>
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Número" />
                </f:facet>
                <hrgi:editableText style="width:33%"
                    value="#{item.numeroDocumento}" />
            </p:column>
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Vencimento" />
                </f:facet>
                <hrgi:editableDate style="width:33%" value="#{item.dataVencimento}" />
            </p:column>
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Valor" />
                </f:facet>
                <hrgi:editableCurrency style="width:33%" value="#{item.valor}">
                    <f:ajax render="@form" event="blur"
                        listener="#{itensAPDespesa.adicionarItem(item)}"
                        onevent="mudarFocoParaCampoInexistente(this.id)" />
                </hrgi:editableCurrency>
            </p:column>
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Remover" />
                </f:facet>
                <h:graphicImage library="img" name="default_trash.png"
                    style="cursor:pointer;">
                    <f:ajax event="click" render="#{p:component('painelTabelaAPDespesa')}"
                        listener="#{itensAPDespesa.removerItem(item)}" />
                </h:graphicImage>
            </p:column>
        </p:dataTable>
        <h:outputLabel
            value="Total: #{modeloPopupRegistroDespesa.valorTotal}">
            <f:convertNumber type="currency" currencyCode="BRL"
                currencySymbol="R$" maxFractionDigits="2" minFractionDigits="2" />
        </h:outputLabel>
    </h:panelGroup>

这可能是因为它不知道它在我要渲染的组件内部,那么我该如何刷新这个组件(在这种情况下是 dataTable 的父级)?

【问题讨论】:

    标签: ajax jsf jsf-2 datatable primefaces


    【解决方案1】:

    PrimeFaces &lt;p:ajax&gt; 组件具有更智能的上下文无关组件定位算法。您可以尝试使用它。

    <h:panelGroup id="painelTabelaAPDespesa">
        <p:dataTable id="tabelaAPDespesa" value="#{itensAPDespesa.itens}" var="item">
            ...
            <p:ajax update="painelTabelaAPDespesa" ... />
            ...
        </p:dataTable>
    </h:panelGroup>
    

    【讨论】:

      【解决方案2】:

      您可以将组件绑定到视图并在 render 中引用其 UIComponent#getClientId()

      <h:panelGroup id="painelTabelaAPDespesa" binding="#{painel}">
          <p:dataTable id="tabelaAPDespesa" value="#{itensAPDespesa.itens}" var="item">
              ...
              <f:ajax render=":#{painel.clientId}" ... />
              ...
          </p:dataTable>
      </h:panelGroup>
      

      【讨论】:

      • 再次感谢 BalusC。第一种方法没有重新渲染任何东西,但第二种方法解决了我的问题。
      • 不客气。我从答案中删除了第一种方法。
      • 伙计,同样的问题,对我来说确实很不直观。像魅力一样工作!
      猜你喜欢
      • 2012-04-09
      • 2012-06-16
      • 2017-06-08
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 2011-12-14
      相关资源
      最近更新 更多