Вызов диалогового окна Primefaces из функции Managed Bean

Привет, у меня есть управляемый компонент с некоторыми функциями, на основе некоторого условия в этой функции я хотел бы вызвать диалоговое окно

Функция управляемого компонента выглядит как

public String editStudent(){    
    setReadOnly(false);     
    setButton(true, true, true, false, true, true,true);
    LockItem lItem;
    if(selectStudent !=null){
        lItem = (LockItem) services.getbyId("LockItem", condition);
        if (lItem == null){
            System.out.println("Student Avalibale for process :::"); 
            studentRedirect();
            return "studentEdit.jsf?faces-redirect=true";
        } else {
             //To show dialog from here
             System.out.println("Student Not Avalibale : Locked By " + lItem.getLockedBy());
        }
    } else {
        FacesMessage msg;
        msg = new FacesMessage("Please select the record.");
        FacesContext.getCurrentInstance().addMessage(null, msg);
        return show("menu");
    }
}

Есть ли какой-либо метод, с помощью которого мы можем вызвать диалоговое окно из такой управляемой функции


person NKS    schedule 30.10.2013    source источник


Ответы (3)


Вы можете, используя RequestContext (или PrimeFaces, если вы используете класс версии 6.2 или выше).

Предположим, у вас есть следующее:

<p:dialog id="myDialogID" widgetVar="myDialogVar">
....
</p:dialog>

Таким образом, как вы делаете в самом Facelet, то есть onclick=myDialogVar.show();, то же самое можно сделать в вашем управляемом bean-компоненте следующим образом:

Для PrimeFaces ‹= 3.x

RequestContext context = RequestContext.getCurrentInstance();
context.execute("myDialogVar.show();");

От PrimeFaces >= 4.x до PrimeFaces ‹ 6.2 (согласно @dognose и @Sujan)

RequestContext context = RequestContext.getCurrentInstance();
context.execute("PF('myDialogVar').show();");

Для PrimeFaces >= 6.2

PrimeFaces current = PrimeFaces.current();
current.executeScript("PF('myDialogVar').show();");

Это для использования целевых диалогов. Если вам просто нужно показать сообщение, не отдавая предпочтения какому-либо пользовательскому диалогу, то вы можете сделать это следующим образом:

FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Message Title", "Message body");

// For PrimeFaces < 6.2
RequestContext.getCurrentInstance().showMessageInDialog(message);

// For PrimeFaces >= 6.2
PrimeFaces.dialog().showMessageDynamic(message);

Вы также можете передавать аргументы и устанавливать обратные вызовы. См. примеры витрин по ссылке.

См. также:

person Vrushank    schedule 30.10.2013

Если у вас Primeface 4.0 или выше:

RequestContext.getCurrentInstance().execute("PF('yourdialogid').show()");
person Joffrey Hernandez    schedule 30.10.2013

Решение Врушанка верное.

Есть и другой способ: в своем диалоговом окне привяжите атрибут rendered к логическому значению вашего bean-компонента и установите для атрибута visible значение true, например:

<p:confirmDialog
        widgetVar="myDialog"
        visible="true"
        rendered="#{myBean.showMyDialog}">

В прослушивателе действий в вашем компоненте вы просто вызываете setShowMyDialog(true), и отображается диалоговое окно (при условии, что ваше диалоговое окно обновляется этим действием). Этот подход полезен, если по какой-то причине вы не хотите, чтобы HTML-код вашего диалогового окна отображался, когда он не виден пользователю. Таким образом, в вашем компоненте у вас есть доступ к информации о том, виден ли ваш диалог.

Еще одним преимуществом этого решения является то, что ваш диалог не скрыт при обновлении ajax (диалога или его родителя).

person hendrix    schedule 30.10.2013