p:手风琴面板选项卡中的commandButton不更新数据表

时间:2018-12-20 18:15:13

标签: jsf primefaces

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

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

现在我什至收到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>

1 个答案:

答案 0 :(得分:0)

首先,您应该编写一个Minimal, Complete and Verifiafle example并删除所有不相关的代码。堆栈溢出并不是旨在编写代码的社区,而是旨在帮助您纠正错误的社区。

曾经说过,记得在update上添加一个<p:commandButton/>属性以更新数据表(我看到您的某些按钮没有此属性)。

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

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

另请参见