【问题标题】:Primefaces DataTable ajax not updating any component except itselfPrimefaces DataTable ajax不更新除自身之外的任何组件
【发布时间】:2012-09-22 13:50:20
【问题描述】:
<h:form id="form">
        <p:messages />
        <p:panel header="Análise">
            <h:outputText value="Mês da análise: " />

            <p:selectOneMenu value="#{report005.selectedMes}">
                <f:selectItems var="data" value="#{report005.analiseMeses}" itemLabel="#{report005.formataDataCombo(data)}" />
                <f:convertDateTime pattern="MM/yyyy" />
            </p:selectOneMenu>

            <p:commandButton value="Análises" update="analiseTable" actionListener="#{report005.loadAnalise()}" />

            <p:dataTable id="analiseTable" var="pes" value="#{report005.analiseModel}" selection="#{report005.selectedAnalise}" emptyMessage="Não há registros...">

                <p:column selectionMode="multiple" style="width:18px" />

                <p:ajax event="rowSelectCheckbox" listener="#{report005.loadAnaliseProduto()}" update="produtosmanycheck" />

                <p:column headerText="Código">  
                    #{pes.cod_analise}  
                </p:column>

                <p:column headerText="Nome">  
                    #{pes.dsc_analise}  
                </p:column>

                <p:column headerText="Descrição">  
                    #{pes.dsc_resumida_acao}  
                </p:column>

                <p:column headerText="Planejamento">
                    <h:outputText value="#{pes.dat_planejamento_analise}">
                        <f:convertDateTime pattern="dd/MM/yyyy" />
                    </h:outputText>
                </p:column>

            </p:dataTable>
        </p:panel>
        <p:panel header="Produto Gerencial">

            <p:selectManyCheckbox id="produtosmanycheck" value="#{report005.selectedProduto}" layout="pageDirection">
                <f:selectItems id="teste" value="#{report005.produtos}" />
            </p:selectManyCheckbox>

        </p:panel>
        <p:commandButton value="Enviar" action="#{report005.send}" ajax="false" />
    </h:form>

当 AJAX 事件“rowSelectCheckbox”被触发时,它没有找到要更新的“produtosmanycheck”组件,向我返回以下错误:

javax.faces.FacesException:找不到具有标识符的组件 从“form:analiseTable”引用的“produtosmanycheck”。在 org.primefaces.util.ComponentUtils.findClientIds(ComponentUtils.java:251) 在 org.primefaces.util.AjaxRequestBuilder.addIds(AjaxRequestBuilder.java:102) 在 org.primefaces.util.AjaxRequestBuilder.update(AjaxRequestBuilder.java:90)

我已经尝试过= :form:produtosmanycheck, form:produtosmanycheck, :produtosmanycheck, produtosmanycheck

我也尝试删除 FORM id...没有成功...

我做错了什么?除了 DataTable,我无法更新任何组件...

【问题讨论】:

  • @BalusC 我打开了生成页面的html,这是为我的selectManyCheckbox生成的代码:
  • 你没有嵌套 forms,是吗?
  • 是的,1 个嵌套。 prependId 设置为 False。
  • 当您查看浏览器页面源中的组件时,您会看到什么 id?

标签: jsf jsf-2 primefaces


【解决方案1】:

您可以使用:form:produtosmanycheck 联系produtosmanycheck

编辑:嵌套表单将正常工作并给出各种 DOM 问题,就像您遇到的那样。想办法将视图组件分成不同的表单,然后尝试上述命名的访问。

【讨论】:

  • 这绝对可以。如果它不适合你@MBarni,那么你检查错了或者你有另一个问题。再试一次,看看有没有出现 javax.faces.FacesException 还是没有更新。
  • 不。问题仍然存在: > javax.faces.FacesException: 找不到具有标识符的组件 > 从“form:analiseTable”引用的“:form:produtosmanycheck”。在 > org.primefaces.util.ComponentUtils.findClientIds(ComponentUtils.java:251) > 在 > org.primefaces.util.AjaxRequestBuilder.addIds(AjaxRequestBuilder.java:102) > 在 > org.primefaces.util.AjaxRequestBuilder.update( AjaxRequestBuilder.java:90)
  • @MBarni 在表单上设置prependId=false
  • 不是ids,禁止嵌套形式。
  • @Fallup。我完全错过了这个问题。嵌套表格?见鬼!
【解决方案2】:

您是否尝试将 id “produtosmanycheck”放在父 p:panel 元素而不是 p:selectManyCheckbox 本身?

在 JSF 中永远不应该进行表单嵌套,即使前缀 ID 为 false,因为它会导致意外行为或没有行为。

【讨论】:

  • 永远不应该进行表单嵌套,不仅在 JSF 中。此外,您的答案的第一部分与实际问题无关。
【解决方案3】:

我将发布我自己的答案(最后我想出了嵌套forms 的想法)以及投票支持@kolossus,因为他基本上是正确的并且不知道嵌套forms

嵌套 forms 不仅仅是 JSF 的“东西”(从 @JordanDenison 的回答看来),它是 HTML 的一般规则 --> 在 HTML 中嵌套 forms 是被禁止的!

您可能想阅读此nesting forms in HTML

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 2018-07-15
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多