วิธีเปิดกล่องโต้ตอบหลายรายการโดยใช้เฟรมเวิร์กกล่องโต้ตอบ Primefaces

ฉันยังใหม่กับ JSF และ Primefaces ฉันต้องเปิดกล่องโต้ตอบที่มีข้อมูลผลการค้นหาบางประเภททุกครั้งที่คลิกปุ่มค้นหา ควรแสดงกล่องโต้ตอบที่เปิดไว้ก่อนหน้านี้เสมอ เว้นแต่ผู้ใช้จะปิด ดังนั้นฉันจึงสามารถเปิดหลายกล่องโต้ตอบได้

ฉันใช้เทคโนโลยีด้านล่าง และปัญหาของฉันคือฉันต้องการใช้เทมเพลต xhtml เดียวสำหรับกล่องโต้ตอบที่ฉันเรียกใช้โดยใช้เฟรมเวิร์กกล่องโต้ตอบ Primefaces มีความคิดบ้างไหมว่าจะบรรลุสิ่งที่ฉันต้องการได้อย่างไร?

  • เจบอส EAP 6.2
  • ไพรม์เฟส 4.0
  • เจเอสเอฟ 2.2

ฉันมีโค้ดตัวอย่างที่ฉันพยายามใช้เป็น POC ด้านล่าง มันทำงานได้ดี ฉันสามารถแสดงกล่องโต้ตอบแรกได้ แต่ฉันไม่รู้ว่าจะเปิดกล่องโต้ตอบอื่นได้อย่างไรเมื่อคลิกปุ่มค้นหาอีกครั้ง

home.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");

    } 
    ...
    }

ทดสอบ.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 แหล่งที่มา


คำตอบ (2)


วิธีการของคุณ GenerateSearchDialog จะแสดงเฉพาะ p:dialog ด้วย id="test" บนเพจของคุณ สิ่งนี้จะทำคือมันจะเปิดกล่องโต้ตอบนั้นและเปิดเฉพาะกล่องโต้ตอบนั้นเท่านั้น (หมายความว่า หากคุณปิดกล่องโต้ตอบและเรียกใช้เมธอดอีกครั้ง กล่องโต้ตอบนั้นจะถูกเปิดขึ้นมาใหม่)

จากสิ่งที่ฉันเข้าใจ คุณต้องการสร้างอินสแตนซ์ Dialog ใหม่ทุกครั้งที่มีการเรียกใช้ createSearchDialog หรือไม่

หากคุณต้องการทำเช่นนี้ คุณต้องสร้างอินสแตนซ์กล่องโต้ตอบใหม่แบบไดนามิก ในหน้าเว็บของคุณ ให้สร้างคอนเทนเนอร์สำหรับกล่องโต้ตอบเหล่านี้ (เช่น กลุ่มแผง) และทุกครั้งที่เรียกใช้เมธอด จะเป็นการสร้างอินสแตนซ์กล่องโต้ตอบใหม่ โปรดทราบว่าการสร้างกล่องโต้ตอบโดยทางโปรแกรมใน Backing Bean ไม่ใช่แนวทางปฏิบัติที่ดี แต่จะช่วยให้คุณบรรลุเป้าหมายนี้ได้ ตอนนี้เพื่อให้ใช้งานได้ ส่วนหัวของกล่องโต้ตอบควรเป็นไดนามิก (อาจเพิ่มตัวนับหรือไม่) Backing bean ของคุณจะมีลักษณะดังนี้:

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
แล้วการสร้างกล่องโต้ตอบนั้นจากไฟล์รวม (เทมเพลต) ล่ะ - person Andrew; 02.02.2017
comment
ฉันต้องลองดู ไม่รู้จริงๆ ว่ามี JSF ที่เทียบเท่ากับการขยายตัวของ Android หรือไม่ (ซึ่งโดยพื้นฐานแล้วคือสิ่งที่คุณต้องการทำ) ... - person rion18; 02.02.2017
comment
ด้วยตัวเลือกกล่องโต้ตอบเดียวที่ฉันใช้: RequestContext.getCurrentInstance().openDialog(templates/filename); (มีหรือไม่มีอาร์กิวเมนต์) และมี templates/filename.xhtml - person Andrew; 02.02.2017
comment
ฉันไม่รู้ว่ามันจะมีผลหรือเปล่า คำถามของ OP บอกว่าสามารถเปิดกล่องโต้ตอบได้หลายรายการ เว้นแต่คุณจะพบวิธีแทรก id ใหม่ลงในไฟล์เทมเพลตแบบไดนามิก... - person rion18; 02.02.2017
comment
สมมติว่าฉันทำได้ แล้วฉันจะทำยังไงล่ะ? - person Andrew; 02.02.2017
comment
อย่างที่ฉันพูดไปก่อนหน้านี้: ฉันต้องลอง / ค้นคว้าเกี่ยวกับเรื่องนั้น ไม่รู้จริงๆ ว่ามี JSF ที่เทียบเท่ากับการขยายตัวของ Android หรือไม่ (ซึ่งโดยพื้นฐานแล้วคือสิ่งที่คุณต้องการทำ) ... - person rion18; 02.02.2017

ฉันมีโค้ดตัวอย่างซึ่งมีรายชื่อบุคคล ทุกครั้งที่ผู้ใช้คลิกที่บุคคลนั้น กล่องโต้ตอบใหม่จะเปิดขึ้น

รหัส 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>

รหัสจาวา:

@ManagedBean(name = "mbean")

@ViewScoped คลาสสาธารณะ TestBean ใช้ 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