2013-04-23 51 views
0

我有一个tabview,我希望在用户选择该选项卡时刷新一个特定选项卡的内容。我还希望模式对话框在标签刷新时弹出。无法在Primefaces中显示对话框RequestContext.execute()调用

这里是TabView的与tabChange AJAX事件处理

<p:dialog widgetVar="statusDialog" modal="true" draggable="false" minimizable="false" appendToBody="true" closable="false" header="Processing..." resizable="false" maximizable="false"> 
    <p:graphicImage library="assets" name="ajax-loader.gif"></p:graphicImage> 
</p:dialog> 

<p:tabView id="tabview" orientation="top" dynamic="false"> 
    <p:ajax event="tabChange" listener="#{bean.tabChangeListener}"></p:ajax> 
    <p:tab title="tab1"> 
     <ui:include src="/WEB-INF/views/tab1.xhtml"/> 
    </p:tab> 
    <p:tab title="tab2"> 
     <p:remoteCommand actionListener="#{bean.refreshData}" update="someTab2ElementID" name="refresh" global="true" onstart="statusDialog.show()" oncomplete="statusDialog.hide()"/> 
     <ui:include src="/WEB-INF/views/tab2.xhtml"/> 
    </p:tab> 
</p:tabView> 

这里是tabChangeListener:如预期

public void tabChangeListener(TabChangeEvent event) { 
    if (event.getTab().getId().equalsIgnoreCase("tab2")) { 
       RequestContext.getCurrentInstance().execute("refresh()"); 
    } 
} 

刷新remoteCommand被调用,但永远不会显示我的statusDialog。如果通过按钮触发相同的remoteCommand,则会出现statusDialog。 JavaScript控制台中没有错误。

为什么当remoteCommand由RequestContext.execute()触发时,statusDialog不显示?我怎样才能让它显示?我甚至尝试添加statusDialog.show()来执行(),但它没有帮助。

+0

你可以试一下吗?'? – 2013-04-23 15:58:00

+0

这将导致statusDialog在所有选项卡更改中显示。我只希望在选择一个特定标签时显示它。 – rootkit 2013-04-23 16:18:57

回答

1

我想通了。这里是解决方案:

<h:outputScript> 
var blockCount=0; 
function showStatus() { 
if (blockCount==0) statusDialog.show(); 
blockCount++; 
}; 
function hideStatus() { 
blockCount--; 
if (blockCount==0) statusDialog.hide(); 
}; 
</h:outputScript> 

<p:ajaxStatus onstart="showStatus();" onsuccess="hideStatus();" onerror="blockCount=0;statusDialog.hide();errorDialog.show();"/> 

<p:remoteCommand actionListener="#{bean.refreshData}" update="someTab2ElementID" name="refresh" global="true" onstart="showStatus()" oncomplete="hideStatus()"/> 

显然为什么没有显示我的状态对话框的原因是,另一个Ajax调用完成,并呼吁statusDialog.hide(),而我的刷新()的事情是怎么回事。上面的JS代码维护着一个正在进行多少个Ajax调用的计数器,并且只有在所有调用完成后才会隐藏状态对话框。现在按预期工作!

0

如果你想显示对话框,当一个特定的标签被改变,你可以告知一个js函数,该选项卡中选择的控制,这是2或不通过Ajax响应添加一个回调参数:

public void tabChangeListener(TabChangeEvent event) { 
    if (event.getTab().getId().equalsIgnoreCase("tab2")) { 
       RequestContext.getCurrentInstance().addCallbackParam("index", 2); 
    } 
} 

及用途:

<p:ajax event="tabChange" listener="#{bean.tabChangeListener}" 
    oncomplete="showOrNot(xhr,status,args)"></p:ajax> 

这将调用JS功能,它会控制该改变的标签是2或不:

function showOrNot(xhr,status,args) { 
    if(args.index==2) { 
     statusDialog.show(); 
    } 
} 

或不同的方法定义的值,并使用p:dialogvisible属性:

public void tabChangeListener(TabChangeEvent event) { 
     if (event.getTab().getId().equalsIgnoreCase("tab2")) { 
        this.condition=true; 
     } 
    } 

而且<p:dialog visible="#{bean.condition}"/>。也许你需要专注于你的第一个办法,你可以给一个ID p:dialog并通过p:remoteCommand更新:

<p:remoteCommand actionListener="#{bean.refreshData}" update="someTab2ElementID dialog" name="refresh" global="true" onstart="statusDialog.show()" oncomplete="statusDialog.hide()"/> 

不要忘了给对话框的确切客户端ID在p:remoteCommand更新属性。

+0

很好的解决方法,但它仍然无法正常工作。控制台没有错误。 – rootkit 2013-04-23 17:23:04

+0

您可以添加警报(1);在js函数中如果情况的内部? – 2013-04-23 18:06:48

+0

@rootkit我编辑了我的答案,您可以尝试其他方法。 – 2013-04-23 18:42:30