Не удается отобразить сведения об объекте в диалоговом окне подтверждения удаления

Вот мой commandButton внутри столбца с данными, задание которого состоит в удалении связанного объекта строки:

   <p:column style="width:6%;text-align:center"
   headerText="Delete">
    <p:commandButton icon="ui-icon-close"
     title="Delete release #{release.name}"
     actionListener="#{releaseBean.deleteRelease(release)}"
     process="@this" update=":display :form2:releaseList">
        <p:confirm
          header="Confirm deleting release #{release.name}"
          message="Are you really sure you want to delete release #{release.name}?"
          icon="ui-icon-alert" />
    </p:commandButton>
   </p:column>

Я хочу, чтобы название выпуска отображалось в сообщении подтверждения удаления (Вы действительно уверены, что хотите удалить выпуск «XYZ»?). Но проблема в том, что имя выпуска «XYZ» не отображается ни в заголовок <p:confirm> ни в сообщении; но это отображается в заголовке <p:commandButton>.

Что я сделал не так? Спасибо.


РЕДАКТИРОВАТЬ:

Я попытался изменить commandButton и добавить setPropertyActionListener:

    <p:commandButton icon="ui-icon-close"
         title="Delete release #{release.name}"
         actionListener="#{releaseBean.deleteRelease(release)}"
         process="@this" update=":display :form2:releaseList">
         <f:setPropertyActionListener
         target="#{gestionReleaseBean.selectedRelease}"
         value="#{release}" />            
         <p:confirm
              header="Confirm deleting release #{release.name}"
              message="Are you really sure you want to delete release #{release.name}?"
              icon="ui-icon-alert" />
    </p:commandButton>

и в компоненте я добавил свойство selectedRelease и его геттер/сеттер.

Это не сработало...


person Sinda MOKADDEM    schedule 15.07.2014    source источник
comment
Является ли сам commandButton обновленным ajax, то есть содержит ли атрибут update commandButton идентификатор встроенного в него компонента?   -  person perissf    schedule 15.07.2014
comment
обновление касается <p:growl id="display"> и всего <p:datatable> (в котором находится кнопка), чтобы подавить только что удаленную строку. Почему?   -  person Sinda MOKADDEM    schedule 15.07.2014
comment
Можно ли использовать автономный dialog или confirmDialog с атрибутом из компонента вместо p:confirm с глобальным confirmDialog?   -  person rion18    schedule 16.07.2014
comment
Похоже, вы наткнулись на возможную ошибку @Siho. Я проверил и подтвердил это сам, <p:confirm/> не может оценить локальную переменную таблицы данных. Похоже, что он может оценивать только те значения, которые доступны во время построения страницы, а не во время рендеринга страницы. Это означает, что только значение, доступное в вашем резервном компоненте до того, как таблица данных будет отображена, попадет в разметку. Вы можете проверить сгенерированный javascript самостоятельно, чтобы убедиться, что js, отвечающий за само всплывающее окно, имеет пустые значения, где ваш var должен быть   -  person kolossus    schedule 16.07.2014
comment
@ rion18, как это сделать, вы имеете в виду вот так (из руководства пользователя PF) <h:form> <p:commandButton type="button" onclick="PF('cd').show()" /> <p:confirmDialog message="Are you sure about destroying the world?" header="Initiating destroy process" severity="alert" widgetVar="cd"> <p:commandButton value="Yes Sure" actionListener="#{buttonBean.destroyWorld}" update="messages" oncomplete="PF('cd').hide()"/> <p:commandButton value="Not Yet" onclick="PF('cd').hide();" type="button" /> </p:confirmDialog> </h:form>   -  person Sinda MOKADDEM    schedule 16.07.2014
comment
Своего рода... Я говорил о наличии переменной с именем selectedObject (или что-то в этом роде) и ссылке на #{bean.selectedObject.name} из диалогового окна...   -  person rion18    schedule 16.07.2014
comment
и как установить значение этого selectedObject?   -  person Sinda MOKADDEM    schedule 16.07.2014
comment
Добавление <f:setPropertyActionListener target="#{bean.selectedObject}" value="#{release}" /> внутри вашего p:commandButton   -  person rion18    schedule 18.07.2014
comment
@ rion18 Это не сработало :( Я отредактировал свой вопрос, чтобы указать, что я сделал   -  person Sinda MOKADDEM    schedule 18.07.2014
comment
В этом случае p:confirm работать не будет. Вам нужно создать диалоговое окно или confirmDialog вне таблицы и сослаться на этот компонент.   -  person rion18    schedule 18.07.2014
comment
попробуй <p:confirm header="Confirm deleting release #{gestionReleaseBean.selectedRelease.name}" message="Are you really sure you want to delete release #{gestionReleaseBean.selectedRelease.name}?" icon="ui-icon-alert"/>   -  person rion18    schedule 19.07.2014
comment
Но ведь это именно тот код, который я написал, не так ли?   -  person Sinda MOKADDEM    schedule 20.07.2014
comment
Нет, в моем диалоговом окне подтверждения используется #{gestionReleaseBean.selectedRelease.name}?, а в вашем - #{release.name}...   -  person rion18    schedule 25.07.2014
comment
Я только что попробовал это, и он все еще не отображает название версии   -  person Sinda MOKADDEM    schedule 29.07.2014


Ответы (1)


Если вы не возражаете против дополнительных строк кода, вы можете добиться этого, как показано ниже:

Сначала поместите диалог вне таблицы данных

<p:dialog modal="true" header="Confirm" widgetVar="wgc" >
 <h:outputText id="msg" />
 <h:inputHidden id="idh" value="#{releaseBean.id}" />
 <p:commandButton value="Delete" action="#{bean.delete()}" />
 <p:commandButton value="Cancel" type="button" onclick="PF('wgc').hide()" />
</p:dialog>

в разделе javascript добавьте это

function confirm(id,name){
 document.getElementById('msg').innerHtml='Are you sure to delete ' +  name;
 document.getElementById('idh').value=id;
 PF('wgc').show();
}

а затем в кнопке удаления с данными

<p:commandButon type="button" 
                value="Delete" 
                onclick="confirm(#{release.id},'#{release.name}')" />
person alessandro    schedule 23.04.2015
comment
Спасибо, alessadro, за ваш ответ, но у меня нет раздела javascript, и я не знаю, куда его поместить на моей странице xhtml. Не могли бы вы прояснить этот момент для меня, пожалуйста? - person Sinda MOKADDEM; 24.04.2015
comment
вы можете добавить приведенный выше код внутри тегов ‹script› ‹/script› в любом месте вашей xhtml-страницы, но хорошо держать js чуть выше закрывающего тега body ‹/h:body› - person alessandro; 25.04.2015
comment
и не забудьте реализовать метод удаления в вашем bean-компоненте, я только что показал вам, как отобразить имя выбранного элемента и передать идентификатор в bean-компонент - person alessandro; 25.04.2015
comment
но хорошо ли держать js чуть выше закрывающего тега body ‹/h:body› ? Как так ?? - person Sinda MOKADDEM; 27.04.2015
comment
У меня есть эта структура в моем файле xml --› ‹body› ‹ui:define name=metadata›‹/ui:define› ‹ui:define name=content›‹/ui:define› ‹/body› - person Sinda MOKADDEM; 27.04.2015
comment
Где я должен добавить тег ‹script› таким образом? - person Sinda MOKADDEM; 27.04.2015
comment
Вы наверняка знаете, где находится конец вашего тега body, если раздел 'content' является последним определенным, то это будет ‹ui:define name=content›---некоторые коды--- ‹script›‹/script›‹/ интерфейс:определить› - person alessandro; 28.04.2015