Creating master-detail table and dialog, how to reuse same dialog for create and edit

后端 未结 1 1286
不思量自难忘°
不思量自难忘° 2020-11-30 09:46

I am attempting to create a dialog that will serve the purpose of both creating objects and updating them. So if I happen to click the \'new\' button I will be presented a d

相关标签:
1条回答
  • 2020-11-30 09:53

    Even if we fix your problem, this construct

    <p:inputText value="#{guestList.hasSelected() ? '' : guestList.selectedGuest.name}">
    

    is not ever going to work. It needs to reference a model property, not an empty string.

    You'd best just reuse the edit form and let the create button precreate an empty entity. This would simplify a lot in the view side. It'd be more easy if the entity has an @Id property which is only present when it's persisted in the database.

    Here's a kickoff example:

    <h:form id="entitiesForm">
        <p:dataTable id="entitiesTable" value="#{bean.entities}" var="entity">
            <p:column>#{entity.foo}</p:column>
            <p:column>#{entity.bar}</p:column>
            <p:column>
                <p:commandButton id="edit" value="Edit" 
                    process="@this" action="#{bean.edit(entity)}"
                    update=":entityDialog" oncomplete="PF('entityDialog').show()" />
                <p:commandButton id="delete" value="Delete" 
                    process="@this" action="#{bean.delete(entity)}"
                    update=":entitiesForm:entitiesTable" />
            </p:column>
        </p:dataTable>
        <p:commandButton id="add" value="Add" 
            process="@this" action="#{bean.add}" 
            update=":entityDialog" oncomplete="PF('entityDialog').show()" />
    </h:form>
    
    <p:dialog id="entityDialog" widgetVar="entityDialog" 
        header="#{empty bean.entity.id ? 'New' : 'Edit'} entity">
        <h:form id="entityForm">
            <p:inputText id="foo" value="#{bean.entity.foo}" />
            <p:inputText id="bar" value="#{bean.entity.bar}" />
            <p:commandButton id="save" value="#{empty bean.entity.id ? 'Create' : 'Update'} entity" 
                process="@form" action="#{bean.save}"
                update=":entitiesForm:entitiesTable" oncomplete="PF('entityDialog').hide()" />
        </h:form>
    </p:dialog>
    

    With this @ViewScoped bean:

    private List<Entity> entities; // +getter
    private Entity entity; // +getter
    
    @EJB
    private EntityService entityService;
    
    @PostConstruct
    public void load() {
        entities = entityService.list();
        entity = null;
    }
    
    public void add() {
        entity = new Entity();
    }
    
    public void edit(Entity entity) {
        this.entity = entity;
    }
    
    public void save() {
        entityService.save(entity); // if (id==null) em.persist() else em.merge()
        load();
    }
    
    public void delete(Entity entity) {
        entityService.delete(entity); // em.remove(em.find(type, id))
        load();
    }
    

    See also:

    • Creating master-detail pages for entities, how to link them and which bean scope to choose
    • Keep p:dialog open when a validation error occurs after submit
    0 讨论(0)
提交回复
热议问题