p:remoteCommand无法在异步模式下工作

时间:2013-09-01 13:39:24

标签: jsf jsf-2 primefaces

如果有人能在这里给我帮助,我将不胜感激。

我在页面上有一个标签式布局,通过单击选项卡(p:commandLink),我想初始化该选项卡的相应数据并更新显示内容的区域。因为我希望初始化延迟发生(当呈现选项卡内容时),我使用的是Primefaces的p:remoteCommand。

问题是当我将p:remoteCommand设置为异步工作(async = true)时,此功能不起作用,不调用action方法。当属性“async”为false时,它可以正常工作。

示例:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">

<h:head>
</h:head>

<f:view contentType="text/html">
    <h:form id="peopleForm">
        <h:panelGroup id="panel1">
            #{testbean.message}
        </h:panelGroup>

        <p:remoteCommand name="lazyInit"
            onstart="console.log('calling init')"
            action="#{testbean.init()}" 
            update=":peopleForm:panel1"
            async="true"
         />

        <script>
        $(function(){
            console.log('before call');
            lazyInit();
            console.log('after call');
        });
        </script>
    </h:form>

    <p:commandLink update=":peopleForm" value="Tab1" action="#{testbean.setMenuSelected('Tab1')}"/>

    <p:commandLink update=":peopleForm" value="Tab2" action="#{testbean.setMenuSelected('Tab2')}"/>
</f:view>
</html>

@ManagedBean(name = "testbean")
@Component("testbean")
@Scope("session")
public class TestBean implements Serializable {

    private static final long serialVersionUID = -2760060999550263904L;

    private String message;
    private String menuSelected = "Tab1";

    public void init() {
        if (menuSelected.equals("Tab1")) {
            message = "Tab1";
        }
        if (menuSelected.equals("Tab2")) {
            message = "Tab2";
        }
    }

    public String getMessage() {
        return message;
    }

    public String getMenuSelected() {
        return menuSelected;
    }

    public void setMenuSelected(String menuSelected) {
        this.menuSelected = menuSelected;
    }
}

当async =“true”时,它不起作用,在链接点击时不调用testbean.init()方法。当'async'为false时,它可以正常工作。

我不确定'async'是否适用于此类用例,或者我误解了它。

背景: 在我的应用程序中,我实际上有多个区域我想要更改选项卡。每个区域都有自己的初始化方法,从数据库中提取适当的数据。我想要异步调用这些初始化方法的原因是我不希望其他初始化方法等待第一个完成,然后第二个完成等等。所有这些方法是相互独立的,所以没有他们之间同步的原因。最终,这应该加快向用户显示页面内容。

感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:0)

我遇到了完全相同的问题并通过将p:remoteCommand替换为隐藏p:commandLink来解决问题。然后没有name属性,因此您需要使用JavaScript来点击链接。

(...)

<h:head>
    <script>
        function lazyInitClick() {
            $("[id$='lazyInit']").click();
        }
    </script>
</h:head>

(...)

<h:form>
    <p:commandLink id="lazyInit" actionListener="#{testbean.init()}" async="true" style="display: none;" />
    <h:outputScript>lazyInitClick()</h:outputScript>
</h:form>

(...)