【问题标题】:p:commandButton in accordionPanel-tab does not update datatable手风琴面板选项卡中的 p:commandButton 不更新数据表
【发布时间】:2019-05-21 07:00:02
【问题描述】:

我的问题如下:我有一个带有不同标签的手风琴面板。在一个选项卡中有一个下拉菜单、一个输入和一个命令按钮。当用户通过单击按钮添加内容时,一个项目将添加到列表中,该列表应显示在上面的数据表中。上面应该呈现另一个 Inputfield 和另一个按钮。

使用 JSF 可以正常工作,但 <h:commandButton/> 会更新整个手风琴面板,关闭当前面板并打开第一个面板。 <p:commandButton/> 首先是“ok”,但它没有更新任何内容,或者找不到标识符。

现在我什至得到了 NullPointerException,因为该按钮显然会在页面加载时自动触发。我不知道错误。我尝试了几件事,但没有任何效果。有人可以帮忙吗?

<p:accordionPanel id="tabPanel" header="Lebensmittel" multiple="true">
            <p:tab title="Neue Mahlzeit erstellen">
                <h:form>
                        <h:outputText value="Neue Mahlzeit erstellen: "/>
                        <br/>
                        <p:selectOneMenu value="#{kcalModel.grocPrototype}">
                            <f:converter binding="#{kcalModel.grocProtoConverter}"/>
                            <f:selectItem itemLabel="Bitte auswählen.." itemValue="" />
                            <f:selectItems value="#{kcalModel.grocPrototypes}" var="groc" itemValue="#{groc.name}"
                                           itemLabel="#{groc.name}"/>
                        </p:selectOneMenu>
                        <!--<h:inputText value="#{kcalModel.amount}"/> Gramm-->
                        <p:inputNumber value="#{kcalModel.amount}" size="5"/> Gramm

                        <p:commandButton value="+ zu neuer Mahlzeit hinzufügen" process="@form" update="form:meal" action="#{kcalModel.addGroceryToMeal()}"/>
                </h:form>

                <h:form id="meal">
                    <p:fragment>
                        <p:autoUpdate />
                        <h:dataTable id="grocs" value="#{kcalModel.meal.groceries}" var="groc">
                            <h:column>
                                <h:outputText value="#{groc.name}"/>
                            </h:column>
                            <h:column>
                                <h:outputText value="#{groc.volumeInGramm}"/>
                            </h:column>
                        </h:dataTable>

                        <h:inputText id="titel" value="#{kcalModel.meal.title}" pt:placeholder="Bezeichnung" required="true"
                                     requiredMessage="Bezeichnung fehlt." rendered="#{kcalModel.meal.groceries.size() > 0}">
                            <h:message for="titel" style="color:indianred"/>
                        </h:inputText>
                        <h:selectOneMenu value="#{kcalModel.meal.mealType}" rendered="#{kcalModel.meal.groceries.size() > 0}">
                            <f:selectItem itemLabel="Bitte auswählen.." itemValue="" />
                            <f:selectItems value="#{kcalModel.mealTypes}" var="type" itemValue="#{type}"
                                           itemLabel="#{type.toString()}"/>
                        </h:selectOneMenu>
                        <h:commandButton value="neue Mahlzeit erstellen" action="#{kcalModel.createMeal()}"
                                         rendered="#{kcalModel.meal.groceries.size() > 0}"/>
                    </p:fragment>

                </h:form>
            </p:tab>

            <p:tab title="Benutzerdefinierte Mahlzeiten" rendered="#{kcalModel.userDefinedMeals.size() > 0}">
                <h:form>
                    <p:selectOneMenu value="#{kcalModel.meal}" rendered="#{kcalModel.userDefinedMeals.size() > 0}">
                        <f:selectItems value="#{kcalModel.userDefinedMeals}" var="uMeal" itemValue="#{uMeal}" itemLabel="#{uMeal.title}"/>
                        <f:converter binding="#{kcalModel.mealConverter}"/>
                    </p:selectOneMenu>
                    <p:commandButton value="+ Mahlzeit hinzufügen" action="#{kcalModel.addMeal()}"
                                     rendered="#{kcalModel.userDefinedMeals.size() > 0}" update=":revenue, :kcals"/>
                </h:form>
            </p:tab>
        </p:accordionPanel>

【问题讨论】:

  • 使用ajax="false"p:commandButton 将作为h:commandButton 工作。使用p:commandButton,您需要更新表单的适当部分。添加表单 id 并将其包含在更新属性中。
  • 我添加了一个 form-id 并做了这个: 但不起作用。错误:找不到组件
  • 现在我有另一个疯狂的行为:现在这是我的按钮: 并且当我调用Page 时,我得到一个NullpointerException,因为它看起来好像按钮是由他自己触发的。有没有人也注意到这种行为?我的另一个按钮也有同样的问题。方法后面的括号对吗?
  • 解决了。评论的按钮被评估。所以删除它们,或者添加:javax.faces.FACELETS_SKIP_COMMENTStrue

标签: jsf primefaces


【解决方案1】:

首先,你应该写一个Minimal, Complete and Verifiafle example 并删除所有不相关的代码。 Stack Overflow 不是一个旨在编写代码而是帮助您纠正错误的社区。​​p>

一旦说过,请记住将update 属性添加到应该更新数据表的&lt;p:commandButton/&gt;(我看到您的某些按钮没有此属性)。

另外,如果要更新的组件是另一种形式,您应该使用对它的绝对引用。例如:

<h:form id="firstForm">
  <p:dataTable id="table" .........
  </p:dataTable>
</h:form>
<h:form id="secondForm">
  <p:commandButton update=":firstForm:table" ....
</h:form>

另请参阅

【讨论】:

  • 感谢您的回答。对不起,如果您认为代码不够简洁和可验证,但我已经删除了其中不相关的部分。所以我不只是粘贴它,我已经想到了。我的代码中没有更新属性的按钮不需要更新属性,因为它们不应该更新任何东西,这就是原因。不过,您的链接对我帮助很大。我的解决方案是,我写了错误的标识符(比较命名容器)。只需获取表单和数据表 ID。
猜你喜欢
  • 1970-01-01
  • 2016-01-10
  • 2016-01-06
  • 2015-09-06
  • 2013-07-25
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多