PrimeFaces v3.5:在非Ajax调用中不使用RequestContext显示Dialog

时间:2013-02-23 10:18:02

标签: java ajax jsf-2 primefaces dialog

在“用户指南”中,声明RequestContext可用于Ajax和非Ajax调用。但是,“用户指南”中的所有示例都使用Ajax,在我的情况下,它不适用于非Ajax调用。

以下是测试页:

<?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://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Test page</title>
    </h:head>
    <h:body>
        <h:form >  

            <p:commandButton ajax="false" value="Non-Ajax" actionListener="#{mrBean.show}" />

            <p:commandButton value="Ajax" actionListener="#{mrBean.show}" />

        </h:form>

        <p:dialog modal="true" id="statusDialog" widgetVar="statusDlg" closable="false" >
            <h:outputText value="Helllooo" />
        </p:dialog>
    </h:body>
</html> 

这是托管bean:

@ManagedBean
@RequestScoped
public class MrBean {

    public void show() {
        System.out.println("SHOW DIALOG");
        RequestContext context = RequestContext.getCurrentInstance();
        context.execute("statusDlg.show();");
    }

}

如果单击Ajax按钮,则会正确显示对话框。但是,Non-Ajax按钮什么也没做。在这两种情况下,SHOW DIALOG消息都打印在控制台上。

如果你能告诉我如何解决这个问题,我将非常感激:)。

致以最诚挚的问候,

James Tran

1 个答案:

答案 0 :(得分:2)

我必须让你失望,但非AJAX请求中的RequestContext可用,但只有有用的函数是isAjaxRequest(),带有布尔返回值。在文档和API参考中,您可以看到,对于所有其他方法,它被告知它们用于AJAX请求。也适用于execute()方法:

  

在当前的ajax请求完成后执行javascript。

过去,RequestContext根本不可用,现在它可用于将来可能与非AJAX请求一起使用。另请参阅this issue