Я думаю, что нашел решение.
Поскольку я использую CODI, я могу использовать аннотацию ConversationGroup
.
Я создал интерфейс emtpy AddressConversation
, затем добавил его ко всем компонентам поддержки, которые должны отображать представление address/addressEdit.xhtml
, а также компоненту поддержки для представления addressEdit
.
Я также использую конфигурацию представления CODI, поэтому мои методы действия возвращают ViewConfig
объекты производного класса.
@Named
@ConversationScoped
@ConversationGroup(AddressConversation.class)
public class AddressView implements Serializable
{
private Class<? extends Views> fromView;
private Address editAddress;
private Address returnAddress;
// Getters/setters etc...
public Class<? extends Views> cancelEdit()
{
returnAddress = null;
return fromView;
}
}
Так что в представлении вызова у меня есть (PrimeFaces commandLink)
<p:commandLink value="#{enquiryView.addressLinkText}" action="#{enquiryView.editAddress()}" immediate="true"/>
и в компоненте поддержки EnquiryView
Я могу @Inject
экземпляр AddressView
в правильной группе диалога, затем установить адрес и возвращать свойства представления при вызове метода действия.
@Named
@ConversationScoped
@ConversationGroup(AddressConversation.class)
public class EnquiryView implements Serializable
{
@Inject @ConversationGroup(AddressConversation.class) private AddressView addrView;
public Class<? extends Views> editAddress()
{
addrView.setAddress(editEnq.getAddress());
addrView.setFromView(Views.Enquiry.EnquiryEdit.class);
return Views.Address.AddressEdit.class;
}
}
Я также могу наблюдать навигацию в EnquiryView
и обновлять объект запроса, когда адрес был «сохранен» в представлении редактирования адреса.
protected void onViewConfigNav(@Observes PreViewConfigNavigateEvent navigateEvent)
{
if (navigateEvent.getFromView() == Views.Address.AddressEdit.class &&
navigateEvent.getToView() == Views.Enquiry.EnquiryEdit.class)
{
onEditAddressReturn();
}
}
private void onEditAddressReturn()
{
if (addrView.getReturnAddress() != null) {
// Save pressed
editEnq.setAddress(addrView.getReturnAddress());
}
}