Primefaces从bean中调用的对话框仅显示一次

5

我试图像这个PrimeFaces ShowCase描述的那样从bean中显示对话框。 问题是一切都按预期工作,对话框出现了,但是如果我关闭对话框,然后再次按下按钮,对话框就不会出现,除非刷新页面。

这与示例中每次按下按钮都会出现对话框的行为不同。

我代码中唯一的区别是我使用了CDI替代品而不是托管bean包,因为javax.faces.bean包将被弃用。我的意思是:

  • javax.inject.Named代替javax.faces.bean.ManagedBean
  • javax.faces.view.ViewScoped代替javax.faces.bean.ViewScoped

无论如何,我也尝试过托管bean包,但仍然存在相同的错误行为。

这是我目前的代码:

index.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:p="http://primefaces.org/ui">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <p:commandButton value="Open" actionListener="#{viewDialogMB.viewDialog()}"/>
        </h:form>
    </h:body>
</html>

ViewDialogMB.java

import java.util.HashMap;
import java.util.Map;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import org.primefaces.context.RequestContext;


@Named(value = "viewDialogMB")
@ViewScoped
public class ViewDialogMB {

    public void viewDialog() {
        Map<String,Object> options = new HashMap<>();
        options.put("modal", true);
        options.put("resizable", true);

        RequestContext.getCurrentInstance().openDialog("dialog", options, null);
    }

}

dialog.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:p="http://primefaces.org/ui">
    <h:head>
        <title>Dialog Title</title>
    </h:head>
    <h:body>
        <p:outputLabel value="Hello from Dialog!" />
    </h:body>
</html>

faces-config.xml(根据Dialog Framework文档)

<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.2"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">    
    <application>
        <action-listener>
            org.primefaces.application.DialogActionListener
        </action-listener>
        <navigation-handler>
            org.primefaces.application.DialogNavigationHandler
        </navigation-handler>
        <view-handler>
            org.primefaces.application.DialogViewHandler
        </view-handler>
    </application>
</faces-config>

顺便说一下,我的平台是:

  • Glassfish 4
  • JSF 2.2
  • JDK 1.7 - 64位
  • Java EE 7
  • PrimeFaces 5.0(社区版)

我已经尝试过Mozilla Firefox,Google Chrome和MS IE11。


禁用commandButton中的ajax。 - user2880020
2个回答

5
这个缺陷在这里报告:PF 4.0.10及更高版本的Dialog Framework回归错误Issue 6915:从DataTable打开DF窗口时,PF 5.0出现错误
作为解决方法的权宜之计,使用taconic的解决方案,在body内添加一个面板。
您的dialog.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:p="http://primefaces.org/ui">
    <h:head>
        <title>Dialog Title</title>
    </h:head>
    <h:body>
    <p:panel>
        <p:outputLabel value="Hello from Dialog!" />
     </p:panel>
    </h:body>
</html>

1
谢谢提供链接和解决方法。我试了一下,现在完美地运作了。不过,性能略低于您在评论中建议禁用ajax的方法。 - dic19
1
非常感谢!PF似乎充满了这样的陷阱。 - Thomas
不用客气。PF虽然可能不是“完美”的,但我们必须感激他们所做的巨大工作。 - user2880020

1

尝试使用<p:dialog>,它们非常方便。或者按照“dic19”的建议禁用ajax,如下所示

<p:commandButton ajax="false" value="Open" actionListener="#{viewDialogMB.viewDialog()}"/>

+1并感谢这个选项。它可以工作,并且比添加<p:panel>提供稍微更好的性能。但是,由于有用的错误报告链接,我已经接受了其他答案。 - dic19

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接