Primefaces: commandButton в verifyDialog не может обновлять данные в той же форме
У меня есть 1 datatable, который включает кнопки редактирования и удаления в каждой строке. Кнопка "Удалить" показывает диалоговое окно подтверждения по щелчку, и с помощью actionListener устанавливает переменную currentObject для объекта, которому она принадлежит, в той же строке.
В диалоговом окне подтверждения да также является командной кнопкой, и она вызывает метод удаления (объект) компонента.
Все отлично работает Удалить функцию ниже:
public void delete(ActionEvent actionEvent) {
categoryRepository.delete(currentCategory);
currentCategory = new Category();
categoryList = categoryRepository.findAll();
}
Я хочу обновить данные после удаления. Но обновление не работает для данных. Я могу только обновить @form, но на этот раз все на странице отключается, и я ничего не могу выбрать. Может быть ошибка.
Вот код xhtml:
<h:form id="categoryForm">
<p:commandButton id="addCategoryButton" value="New"
onclick="categoryDialog.show();" type="button" />
<p:dataTable var="cat" value="#{categoryBean.categoryList}"
rowKey="#{cat.id}" paginator="true" rows="10"
selection="#{categoryBean.selectedCategories}" id="categoryTable"
widgetVar="categoryTable">
<f:facet name="header">
Category List
</f:facet>
<p:column selectionMode="multiple" />
<p:column headerText="Name" sortBy="#{cat.name}"
filterBy="#{cat.name}" id="name">
#{cat.name[categoryBean.currentLocale.language]}
</p:column>
<p:column headerText="Sort Order" sortBy="#{cat.sortOrder}"
filterBy="#{cat.sortOrder}" id="sortOrder">
#{cat.sortOrder}
</p:column>
<p:column headerText="Actions" id="actions">
<h:commandButton action="#{categoryBean.edit(cat)}" value="Edit" />
<h:commandButton value="Delete"
onclick="deleteConfirmation.show()" type="button">
<f:setPropertyActionListener value="#{cat}"
target="#{categoryBean.currentCategory}" />
</h:commandButton>
</p:column>
</p:dataTable>
<p:confirmDialog id="deleteConfirmDialog" message="Are you sure?"
header="Initiating destroy process" severity="alert"
widgetVar="deleteConfirmation">
<p:commandButton id="confirm" value="Yes Sure"
update=":categoryForm:categoryTable"
oncomplete="deleteConfirmation.hide()"
actionListener="#{categoryBean.delete}" />
<p:commandButton id="decline" value="Not Yet"
onclick="deleteConfirmation.hide()" type="button" />
</p:confirmDialog>
<p:dialog id="categoryDialog" header="Category Detail"
widgetVar="categoryDialog" resizable="false" style="width:90%;"
showEffect="explode" hideEffect="explode">
<p:panel id="panel" header="Edit Category"
style="margin-bottom:10px;">
<p:messages id="messages" />
<h:panelGrid columns="3">
<h:outputLabel for="nameTabView" value="Name: " />
<p:tabView id="nameTabView">
<c:forEach var="locale" items="#{categoryBean.userLocales}">
<p:tab title="#{locale.displayLanguage}">
<h:panelGrid columns="2" cellpadding="10">
<h:inputText
value="#{categoryBean.currentCategory.name[locale.language]}" />
</h:panelGrid>
</p:tab>
</c:forEach>
</p:tabView>
</h:panelGrid>
<p:commandButton id="saveCategoryButton" value="Save"
oncomplete="categoryDialog.hide()"
actionListener="#{categoryBean.save}"
update="categoryTable, categoryDialog" />
</p:panel>
</p:dialog>
</h:form>
2 ответа
Я сделал большую ошибку. Я использовал тег. Я должен использовать для простых лиц.
<h:form id="categoryForm">
<p:commandButton id="addCategoryButton" value="New"
onclick="categoryDialog.show();" type="button" />
<p:dataTable var="cat" value="#{categoryBean.categoryList}"
rowKey="#{cat.id}" paginator="true" rows="10"
selection="#{categoryBean.selectedCategories}" id="categoryTable"
widgetVar="categoryTable">
<f:facet name="header">
Category List
</f:facet>
<p:column selectionMode="multiple" />
<p:column headerText="Name" sortBy="#{cat.name}"
filterBy="#{cat.name}" id="name">
#{cat.name[categoryBean.currentLocale.language]}
</p:column>
<p:column headerText="Sort Order" sortBy="#{cat.sortOrder}"
filterBy="#{cat.sortOrder}" id="sortOrder">
#{cat.sortOrder}
</p:column>
<p:column headerText="Actions" id="actions">
<p:panelGrid columns="2" styleClass="actions" cellpadding="2">
<p:commandButton action="#{categoryBean.edit(cat)}" value="Edit" />
<p:commandButton value="Delete"
onclick="deleteConfirmation.show()">
<f:setPropertyActionListener value="#{cat}"
target="#{categoryBean.currentCategory}" />
</p:commandButton>
</p:panelGrid>
</p:column>
</p:dataTable>
<p:confirmDialog id="deleteConfirmDialog" message="Are you sure?"
header="Initiating destroy process" severity="alert"
widgetVar="deleteConfirmation">
<p:commandButton id="confirm" value="Yes Sure"
update=":categoryForm:categoryTable"
oncomplete="deleteConfirmation.hide()"
actionListener="#{categoryBean.delete}" />
<p:commandButton id="decline" value="Not Yet"
onclick="deleteConfirmation.hide()" type="button" />
</p:confirmDialog>
<p:dialog id="categoryDialog" header="Category Detail"
widgetVar="categoryDialog" resizable="false" style="width:90%;"
showEffect="explode" hideEffect="explode">
<p:panel id="panel" header="Edit Category"
style="margin-bottom:10px;">
<p:messages id="messages" />
<h:panelGrid columns="3">
<h:outputLabel for="nameTabView" value="Name: " />
<p:tabView id="nameTabView">
<c:forEach var="locale" items="#{categoryBean.userLocales}">
<p:tab title="#{locale.displayLanguage}">
<h:panelGrid columns="2" cellpadding="10">
<h:inputText
value="#{categoryBean.currentCategory.name[locale.language]}" />
</h:panelGrid>
</p:tab>
</c:forEach>
</p:tabView>
</h:panelGrid>
<p:commandButton id="saveCategoryButton" value="Save"
oncomplete="categoryDialog.hide()"
actionListener="#{categoryBean.save}"
update="categoryTable, categoryDialog" />
</p:panel>
</p:dialog>
</h:form>
Спасибо за помощь
Похоже, это проблема обновления DOM после запроса AJAX. Я не могу сказать точно, так как вы не предоставили разметку страницы, но я думаю, что это по следующей причине:
Если вы хотите, чтобы части страницы обновлялись, после завершения вызова ajax вам необходимо предоставить идентификатор компонента для обновления в качестве значения для update
атрибут командной кнопки / ссылки на команду. Я думаю, это то, что ты сделал.
Проблема заключается в том, что вы можете предоставить идентификатор серверной части компонента для обновления, только если он находится в том же контейнере именования, что и компонент, вызвавший запрос. Вы можете попробовать использовать следующий идентификатор для обновления таблицы <p:commandButton action="xxx" update=":myForm:myTable" />
для обновления таблицы с идентификатором "myTable" внутри формы с идентификатором "myForm".