2011-11-18 101 views
5

我正在实施一些对话,需要一个公共轮询从服务器获取新值。 我想使用p:poll,但不幸的是我不能停止它。 我在用户单击一个对话框中的按钮时开始投票,并尝试在用户单击子对话框中的某个按钮时停止投票。这是代码我真的用来启动和停止投票:无法停止primefaces轮询

firstDialog:

<p:poll autoStart="false" widgetVar="pollQtdDisponivelCarregamento" immediate="true" 
    update="labelQuantidadeDisponivelCarregamento labelQuantidadeDisponivelItem" 
    listener="#{atualizadorQuantidadeDisponivelProduto.atualizarQuantidadeDisponivel(modeloPopupCarregarProduto.produtoSelecionado)}" /> 
<p:commandButton action="#{controladorPopupCarregarProduto.abrir}" 
    value="#{vendaMsg['popup.pre_venda.botao.adicionar_produto']}" 
    title="#{vendaMsg['popup.pre_venda.botao.adicionar_produto.descricao']}" 
    update="@form" onclick="pollQtdDisponivelCarregamento.start()" /> 

childDialog:

<p:commandButton value="OK" style="float:right" immediate="true" 
    action="#{controladorPopup.fechar}" update="@form" 
    onsuccess="pollQtdDisponivelCarregamento.stop();" /> 

一件事,我无法理解的是:当我打破的JavaScript执行使用Firebug调试,投票停止正确,但是当我不这样做时,它不会停止。有人知道我该如何解决这个问题?

回答

6

我与'民意调查'组件有类似的问题(谷歌发送我在这里)。据我所知,你的标记有两个问题。我正在使用Primefaces 3.0M4

问题1

使用<p:poll clientVar="myPoll"/>将创建使用window.myPoll访问的javascript对象。如果包含表单被重新渲染(请参阅您的'更新'属性),此属性将被覆盖。问题在于使用'window.setInterval'。如果在更换前停止轮询,则此间隔丢失。

解决方案:

  1. 您可以创建只包含轮询组件的顶级<form>
  2. onclick="pollQtdDisponivelCarregamento.start(); return false;"阻止将表单发送到服务器。 (我怀疑这是你的意图)

问题2

poll.start()不检查它是否已经在运行。调用两次将导致另一个间隔被调度。第一个的 id丢失,但它仍然存在向您的服务器发送请求。尝试快速点击“第一个对话框”中的按钮。

解决方案:

检查它是否已经通过调用poll.isActive()首先运行。

+0

顺便说一句。你写道:“当我用Firebug分解JavaScript执行时”。但是哪里? – MartinK