2013-04-09 4 views
1

У меня есть таблица в форме. В одном из столбцов в таблице отображается строка кнопок для редактирования и удаления записей в таблице. Когда я удаляю запись с помощью элемента управления из атрибута action кнопки, он работает так, как ожидалось.Первичные данные DataTable - удаление с помощью диалога удаляет неправильную запись

Но как только я добавил диалоговое окно, позволяющее пользователю подтвердить удаление, неправильная запись удаляется. Это всегда последняя запись в текущей таблице. Я не знаю, в чем причина: я использую тот же DataTablevar для кнопки и для диалога.

Я работаю с JSF 2 (Mojarra 2.1.6) и Primefaces 3.5, размещенными на JBoss 7.1.1 на машине Suse 12.2.

Форма:

<h:form id="downloads"> 
    <ui:include src="components/table.xhtml"/> 
</h:form> 

Стол:

<ui:composition> 

    <p:dataTable value="#{controller.currentLevelResources}" 
      var="download" id="downloadTable" scrollHeight="120" rows="10"> 

    <p:column sortBy="#{download.name}"> 
     <f:facet name="header">Name</f:facet> 
     <h:outputText id="downloadName" value="#{download.name}" title="#{download.description}" /> 
    </p:column> 

      ... 

    <p:column> 
     <ui:include src="menuBar.xhtml"></ui:include> 
    </p:column> 

Строка меню:

<ui:composition> 

     <p:commandButton id="edit" 
      action="#{downloadEditController.editResource(download)}" 
      icon="ui-icon-gear" title="Edit" oncomplete="updateStyles()" 
      update=":downloads" /> 

     <p:commandButton id="delete" onclick="deletedDlg.show();" 
      icon="ui-icon-trash" title="Delete" oncomplete="updateStyles()" /> 

     <p:dialog header="Delete confirmation" widgetVar="deletedDlg" 
      resizable="false"> 
      <h:panelGroup layout="block" style="padding:5px;"> 
       <h:outputText 
        value="The Resource #{download} will be deleted. Proceed?" /> 
      </h:panelGroup> 
      <p:commandButton id="deleteBtn" value="Delete" 
       oncomplete="deletedDlg.hide(); updateStyles(); " 
       action="#{downloadEditController.deleteResource(download)}" 
       process="@this" update=":downloads"> 
      </p:commandButton> 
      <p:commandButton value="Cancel" type="button" 
       onclick="deletedDlg.hide();" /> 
     </p:dialog> 

Если я заменяю диалог с этим, все работает:

<p:commandButton id="delete" icon="ui-icon-trash" title="Delete" 
action="#{downloadEditController.deleteResource(download)}" 
oncomplete="updateStyles()" update=":downloads" /> 

ответ

6

Создание <p:dialog> для каждой строки - не очень хорошая идея.

Для начала Вам нужно создать одиночный файл <p:dialog> вне вашего <p:dataTable>.

Следующей вещь, которую я хотел бы сделать, это установить идентификатор или строку вар в вашем компоненте при удалении кнопки мыши и в случае подтверждения в диалоговом окне использования, идентификатора или строка вар из фасоли для удаления.

Это как ваша кнопка удаления может выглядеть, установить download вар в prepareDataForDeletion действий и показать диалог ...

<p:commandButton id="deleteConfirmation" icon="ui-icon-trash" title="Delete" 
    action="#{downloadEditController.prepareDataForDeletion(download)}" 
    onsucess="deletedDlg.show();"/> 

Что касается текущей аномалии: это потому, что все ваши диалоги имеют то же widgetVar, и каждый следующий один переопределяет ранее объявленный до конца. Вы могли бы динамически дать им разные имена виджетов, такие как widgetVar="deleteDlg_#{someIndex}", но это не имеет смысла, если вы можете иметь только один диалог многократного использования, содержимое которого обновляется до открытия.

+0

сделаю. Спасибо, что посмотрели. У вас есть идея, ПОЧЕМУ мой подход не работает (я знаю, что это сложная часть вопроса). Я использую одну и ту же переменную в конце концов? И внешнее диалоговое окно WRT, как бы я одновременно установил var в свой bean-компонент и активировал диалог? – kostja

+0

Работает отлично. Еще раз спасибо, Daniel – kostja

+0

Добро пожаловать. – Daniel

Смежные вопросы