Cara membuka beberapa dialog menggunakan kerangka dialog Primefaces

Saya baru mengenal JSF dan Primefaces, saya perlu membuka dialog yang berisi semacam informasi hasil pencarian setiap kali tombol pencarian diklik. Dialog yang terbuka sebelumnya harus selalu ditampilkan kecuali pengguna menutupnya, sehingga saya dapat membuka beberapa dialog.

Saya menggunakan teknologi di bawah ini, dan masalah saya adalah saya hanya ingin menggunakan satu template xhtml untuk dialog yang saya panggil menggunakan kerangka dialog Primefaces. Adakah yang tahu bagaimana mencapai apa yang saya inginkan?

  • JBoss EAP 6.2
  • Wajah Utama 4.0
  • JSF 2.2

Saya memiliki contoh kode yang saya coba kerjakan sebagai POC di bawah ini. Ini berfungsi dengan baik. Saya dapat menampilkan dialog pertama, tetapi saya tidak lagi tahu cara membuka dialog lain ketika tombol pencarian diklik lagi.

rumah.xhtml

<div id="searchBtnDiv">
            <p:commandButton id="queryNetworkElem" value="Search" ajax="true"    actionListener="#{searchBean.querySubmit}" />  
            <p:commandButton id="advanceQuery" value="Advance Search" ajax="true" actionListener="#{searchBean.querySubmit}" /> 
        </div>

SearchBean.java

    @ManagedBean(name = "searchBean")
    public class SearchBean{
    ...
    public void generateSearchDialog(String searchParam) throws IOException{

        System.out.println("opening dialog");
        testMessage = "testing ";


        RequestContext.getCurrentInstance().openDialog("test");

    } 
    ...
    }

tes.xhtml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:p="http://primefaces.org/ui"
    xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">

   <h:head>
   </h:head>
   <h:body>
       <h1><p:outputLabel value="#{searchBean.testMessage}"/></h1>
        <p:commandButton value="test" />        
   </h:body>
   </html>

person Joecep    schedule 22.04.2014    source sumber


Jawaban (2)


Metode Anda generateSearchDialog hanya menampilkan p:dialog dengan id="test" di halaman Anda. Apa yang akan dilakukan adalah membuka dialog itu dan hanya dialog itu (artinya, jika Anda menutup dialog dan memanggil metode itu lagi, dialog itu akan dibuka kembali).

Dari apa yang saya pahami, Anda ingin membuat instance Dialog baru dengan setiap panggilan ke generateSearchDialog?

Jika Anda ingin melakukan ini, Anda perlu membuat contoh dialog baru secara dinamis. Di halaman web Anda, buatlah sebuah wadah untuk dialog-dialog ini (yaitu panelGroup) dan setiap kali metode ini dipanggil, maka akan dibuat sebuah instance Dialog baru. Ingatlah bahwa membuat dialog secara terprogram di backing bean bukanlah praktik yang baik, tetapi ini akan membantu Anda mencapai hal ini. Sekarang, agar ini berfungsi, header dialog harus dinamis (mungkin menambahkan penghitung?) Backing bean Anda akan terlihat seperti ini:

UIComponent panelGroup = FacesContext.getCurrentInstance()
        .getViewRoot().findComponent("dialogContainer");
Dialog dialog = new Dialog();
dialog.setId("newDialogInstance" + counter);
dialog.setVisible(true); //add whatever code you like
...
panelGroup.getChildren().add(dialog);
...
//update the WHOLE panel
RequestContext.getCurrentInstance().update("dialogContainer");
// OR openDialog your new Dialog.
RequestContext.getCurrentInstance().openDialog("newDialogInstance" + counter);
...
counter++;
person rion18    schedule 22.04.2014
comment
Bagaimana dengan membuat dialog itu dari file include (templat)? - person Andrew; 02.02.2017
comment
Saya harus mencobanya. Tidak begitu tahu apakah ada yang setara dengan JSF untuk inflasi Android (yang pada dasarnya adalah apa yang ingin Anda lakukan)... - person rion18; 02.02.2017
comment
Nah dengan opsi dialog tunggal yang saya gunakan: RequestContext.getCurrentInstance().openDialog(templates/filename); (dengan atau tanpa argumen) dan itu termasuk templat/nama file.xhtml. - person Andrew; 02.02.2017
comment
Saya tidak tahu apakah itu berlaku. Pertanyaan OP mengatakan bahwa banyak dialog bisa terbuka. Kecuali Anda menemukan cara untuk memasukkan id baru secara dinamis pada file templat... - person rion18; 02.02.2017
comment
Misalkan saya bisa. Lalu bagaimana aku melakukannya? - person Andrew; 02.02.2017
comment
Seperti yang saya katakan sebelumnya: Saya harus mencobanya/meneliti tentang itu. Tidak begitu tahu apakah ada yang setara dengan JSF untuk inflasi Android (yang pada dasarnya adalah apa yang ingin Anda lakukan)... - person rion18; 02.02.2017

Saya memiliki kode contoh yang memiliki Daftar Orang. Setiap kali Pengguna mengklik orang tersebut, dialog baru akan terbuka

kode xhtml:

<h:form id="form">
    <p:dataTable value="#{mbean.personList}" var="person">
        <p:column headerText="Name">
            <p:commandLink value="#{person.name}" 
                update=":form">
                <f:setPropertyActionListener target="#{mbean.selectedPerson}"
                    value="#{person}" />
            </p:commandLink>
        </p:column>
        <p:column headerText="Country">
            #{person.country}
        </p:column>
    </p:dataTable>

    <!-- <ui:include src="/WEB-INF/test.xhtml" /> -->
    <ui:repeat var="d" value="#{mbean.personList}">

        <p:dialog id="_#{d.getId()}"  modal="false" width="500" height="500" widgetVar="Jag:#{d.getId()}">
        <p:ajax event="close" listener="#{mbean.handleClose}" />
            <h:outputLabel value="#{d.getName()}"></h:outputLabel>

        </p:dialog>
    </ui:repeat>

</h:form>

Kode Jawa:

@ManagedBean(name = "mbean")

@ViewScoped kelas publik TestBean mengimplementasikan Serializable {

private List<Person> personList;
private Person selectedPerson;
private String dialogName;
private static int count=0;
private Map<Integer, String> dialogRemover = new HashMap<>();




public Map<Integer, String> getDialogRemover() {
    return dialogRemover;
}

public void setDialogRemover(Map<Integer, String> dialogRemover) {
    this.dialogRemover = dialogRemover;
}


public String getDialogName() {
    return dialogName;
}

public void setDialogName(String dialogName) {
    this.dialogName = "jag"+String.valueOf(count++);
}

public TestBean() {
    personList = new ArrayList<Person>();
    personList.add(new Person(6,"Aaa", "UK"));
    personList.add(new Person(7,"Bbb", "Australia"));
    personList.add(new Person(8,"Ccc", "Asia"));

}

public List<Person> getPersonList() {
    return personList;
}

public void setPersonList(List<Person> personList) {
    this.personList = personList;
}

public Person getSelectedPerson() {
    return selectedPerson;
}

public void handleClose(CloseEvent event){
    System.out.println("eventZ: "+event.getComponent().getId());
    System.out.println("handle close event "+event.getComponent().getClientId());
    String[] array = event.getComponent().getClientId().split(":");
    dialogRemover.remove(Integer.parseInt(array[2]));
    System.out.println("list elements are "+dialogRemover.size());

}

public void setSelectedPerson(Person selectedPerson) {
    this.selectedPerson = selectedPerson;
    String test = this.selectedPerson.getName();

        if(!dialogRemover.containsValue("Jag:"+String.valueOf(this.selectedPerson.getId())) ){
            dialogRemover.put(personList.indexOf(this.getSelectedPerson()),"Jag:"+String.valueOf(this.selectedPerson.getId()));
        }
        RequestContext context1 = RequestContext.getCurrentInstance();          
        for (Map.Entry<Integer, String> entry : dialogRemover.entrySet()) {
            context1.execute("PF('"+entry.getValue()+"').show();");
        }       
}

}

person Jag    schedule 13.02.2017