JSF / Primefaces: диалог обновления не работает - PullRequest
0 голосов
/ 20 марта 2020

У меня есть dataTable с commandButton в каждом row. Если я нажму commandButton, откроется dialog с некоторыми подробностями в выбранной строке.

<p:commandButton
                        update="mainForm:myDialog"
                        action="#{bean.fetchData(user)}"
                        oncomplete="PF('myDialog').show();"
                        title="Details"
                    />

Это метод fetchData() в bean:

 public void fetchData(user) {
        this.events = this.db.fetchDataForUser(user);
    }

Диалог:

<p:dialog
    header="Details"
    id="myDialog"
    modal="true"
    resizable="false"
    width="1000px"
    height="700px"
>
    <p:dataTable
        value="#{bean.events}"
        var="event"
    >
        <p:column
            headerText="Event"
            style="vertical-align: top; text-align: center;"
            width="auto"
        >
            <h:outputText
                value="#{event.eventType}"
            />
        </p:column>


       ....


    </p:dataTable>
</p:dialog>

Идея состоит в том, что когда commandButton нажата, fetchData() запускается и устанавливает список events. После этого dialog открывается и отображает events. Но это не работает. До вызова fetchData, getter выполняется несколько раз. Затем fetchData() вызывается как ожидалось и устанавливает список events. Но когда снова вызывается getter для events, events по-прежнему null.

1 Ответ

1 голос
/ 21 марта 2020

выполните следующие шаги и изучите пример из демонстрации PrimeFaces

  • Сначала поместите объект в ваш компонент как selectedUser.
  • Затем необходимо установить selectedUser. Для этого вы можете использовать setPropertyActionListener .
  • Затем вы можете вызвать свой метод в диалоговом окне. Ваш метод будет таким:

    publi c void fetchData () {this.events = this.db.fetchDataForUser (this.selectedUser); }

Вы можете найти решение в PrimeFaces - Showcase - DataTable - Selection .

<p:dataTable id="basicDT" var="car" value="#{dtSelectionView.cars1}">
    <f:facet name="header">
        Basic
    </f:facet>
    <p:column headerText="Id">
        <h:outputText value="#{car.id}" />
    </p:column>
    <p:column headerText="Year">
        <h:outputText value="#{car.year}" />
    </p:column>
    <p:column headerText="Brand">
        <h:outputText value="#{car.brand}" />
    </p:column>
    <p:column headerText="Color">
        <h:outputText value="#{car.color}" />
    </p:column>
    <p:column style="width:32px;text-align: center">
         <p:commandButton update=":form:carDetail" oncomplete="PF('carDialog').show()" icon="pi pi-search" title="View">
            <f:setPropertyActionListener value="#{car}" target="#{dtSelectionView.selectedCar}" />
        </p:commandButton>
    </p:column>
</p:dataTable>

Мы должны установить выбранный объект с помощью setPropertyActionListener , после чего мы можем получить данные в соответствии с ним в диалоговом окне.

<p:dialog header="Car Info" widgetVar="carDialog" modal="true" showEffect="fade" hideEffect="fade" resizable="false">
    <p:outputPanel id="carDetail" style="text-align:center;">
        <p:panelGrid  columns="2" rendered="#{not empty dtSelectionView.selectedCar}" columnClasses="label,value">
            <f:facet name="header">
                <p:graphicImage name="demo/images/car/#{dtSelectionView.selectedCar.brand}-big.gif"/> 
            </f:facet>

            <h:outputText value="Id:" />
            <h:outputText value="#{dtSelectionView.selectedCar.id}" />

            <h:outputText value="Year" />
            <h:outputText value="#{dtSelectionView.selectedCar.year}" />

            <h:outputText value="Color:" />
            <h:outputText value="#{dtSelectionView.selectedCar.color}" style="color:#{dtSelectionView.selectedCar.color}"/>

            <h:outputText value="Price" />
            <h:outputText value="$#{dtSelectionView.selectedCar.price}" />
        </p:panelGrid>
    </p:outputPanel>
</p:dialog>

В бине

@Named("dtSelectionView")
@ViewScoped
public class SelectionView implements Serializable {

    private Car selectedCar;

    public Car getSelectedCar() {
        return selectedCar;
    }

    public void setSelectedCar(Car selectedCar) {
        this.selectedCar = selectedCar;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...