Вопрос по primefaces, jsf – f: setPropertyActionListener не вызывается

5

Я пытаюсь переместитьp:dialog изh:formпотому что я прочитал, что это предпочтительный способ (однако я хотел бы понять причину, потому что мойp:dialog внутриform хорошо работает в моем приложении).

Единственная сложность заключается в том, что заголовок диалога должен обновляться динамически. Диалог отображается, когда кнопка вp:dataTable нажата.

Вот мой старый xhtml (до изменений), который работает нормально:

<p:dataTable var="event" value="#{eventBean.lazyModel}" selection="#{eventBean.selectedEvent}" />
    ...
    <p:column headerText="#{msgs.Persons}">
        <p:commandButton value="#{msgs.ViewPersons}" update=":viewPersonsForm" oncomplete="viewPersonsDlg.show()"> 
            <f:setPropertyActionListener value="#{event}" target="#{eventBean.selectedEvent}" />
        </p:commandButton>
    </p:column>
</p:dataTable>
<h:form id="viewPersonsForm">
    <p:dialog modal="true" widgetVar="viewPersonsDlg" dynamic="true" header="#{eventBean.selectedEvent.name}" >
        ...
    </p:dialog>
</h:form>

А вот новый xhtml с eventBean # setSelectedEvent (), который не вызывается.

<p:dataTable var="event" value="#{eventBean.lazyModel}" selection="#{eventBean.selectedEvent}" />
    ...
    <p:column headerText="#{msgs.Persons}">
        <p:commandButton value="#{msgs.ViewPersons}" update=":viewPersonsDlgId" oncomplete="jQuery('#viewPersonsDlgId .ui-dialog-title').text('#{eventBean.selectedEvent.name}');viewPersonsDlg.show()"> 
            <f:setPropertyActionListener value="#{event}" target="#{eventBean.selectedEvent}" />
        </p:commandButton>
    </p:column>
</p:dataTable>
<p:dialog modal="true" id="viewPersonsDlgId" widgetVar="viewPersonsDlg" dynamic="true" >
    ...
</p:dialog>

Итак, еще раз, почему во втором сценарии eventBean # setSelectedEvent () не вызывается? И, если возможно, почему первый сценарий не оптимален?

Ваш Ответ

2   ответа
2

У меня была такая же проблема (pf 3.5):

<p:tabView id="cashFlowTabContainer" style="width:100%" activeIndex="0"
    widgetVar="cashFlowTabContainerVar">
    <p:tab title="#{labels['cashflow_incoming']}">
        <p:outputPanel id="incomingPanel">
            <p:dataTable value="#{cashFlowController.incomingCashFlows}"
                var="cashFlow">
<p:column headerText="#{labels.cashflow_actions}">
                    <p:commandButton value="Edit"
                        action="#    {cashFlowController.editIncoming}" update="@form" oncomplete="editInputVar.show();">
                        <f:setPropertyActionListener     value="#{cashFlow}"
                            target="#{cashFlowController.selectedIncoming}" />
                    </p:commandButton>
                </p:column>

а это был мой диалог:

<p:dialog id="editInput" header="Dynamic Dialog"
    widgetVar="editInputVar" resizable="false" draggable="false"
    modal="true">
    <p:panel>
        <h:panelGrid columns="2" cellpadding="5">
...
<h:outputText value="#{labels.cashflow_description}:" />
            <h:inputText
                value="#{cashFlowController.selectedIncoming.description}" />

Так ... Так никогда не вызывали сеттера. Затем я заметил, что если я опустошил диалоговое окно, вызывался сеттер.

Так что я решил это, поместив «визуализированный» оператор на панель:

<p:dialog id="editInput" header="Dynamic Dialog"
    widgetVar="editInputVar" resizable="false" draggable="false"
    modal="true">
    <p:panel **rendered="#{cashFlowController.selectedIncoming != null}"**>
        <h:panelGrid columns="2" cellpadding="5">

Я думаю, что есть нулевой указатель, который нигде не зарегистрирован ... в любом случае, так оно и работает:)

Это сработало. Странная проблема, хотя Makky
4

p:dialog внутриh:form поскольку в некоторых случаях это может работать, но в большинстве случаев вы столкнетесь с неожиданным поведением, вот несколько объяснений:

Почему бы не разместитьp:dialog внутриh:form 1

Почему бы не разместитьp:dialog внутриh:form 2

Проблема в вашем случае в том, что метод jQuery вoncomplete вызывается до того, как значение будет установлено с помощьюf:setPropertyActionListener. Чтобы избежать этого, используйте то же решение, которое вы использовали в первом случае. Так

<p:dataTable var="event" value="#{eventBean.lazyModel}" selection="#{eventBean.selectedEvent}" />
    ...
    <p:column headerText="#{msgs.Persons}">
        <p:commandButton value="#{msgs.ViewPersons}" update=":viewPersonsDlgId" oncomplete="viewPersonsDlg.show()"> 
            <f:setPropertyActionListener value="#{event}" target="#{eventBean.selectedEvent}" />
        </p:commandButton>
    </p:column>
</p:dataTable>
<p:dialog modal="true" id="viewPersonsDlgId" widgetVar="viewPersonsDlg" dynamic="true" header="#{eventBean.selectedEvent.name}" >
    ...
</p:dialog>

Нет необходимости использовать jQuery здесь.

Отлично, это решило и мою проблему :). Большое спасибо : EduardoFernandes
Вы правы, проблема в другом. Позвольте мне продолжить расследование ... perissf
Я проверил это, и оно работает нормально. Если сеттер не запущен для вас, то один из этапов цикла JSF завершился неудачно. Добавлять<h:messages> на свою страницу и проверьте наличие ошибок. Fallup
Спасибо за ссылки. К сожалению, сеттер не срабатывает даже при вашей настройке. perissf

Похожие вопросы