我正在实现一些对话框,这些对话框需要进行公共(public)调查才能从服务器获取新值。
我正在尝试使用p:poll,但是不幸的是我无法停止它。
我在用户单击一个对话框中的按钮时启动民意调查,并尝试在用户单击子对话框中的按钮时停止民意调查。这是我用来启动和停止民意测验的代码:

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();" />

我无法理解的一件事是:当我使用Firebug调试中断javascript执行时,民意调查正确停止,但是当我不这样做时,民意调查就不会停止。
有人知道我该如何解决?

最佳答案

我在“投票”组件中遇到了类似的问题(谷歌在此向我发送了邮件)。据我所知,您的标记存在两个问题。我正在使用Primefaces 3.0M4。

问题1

使用<p:poll clientVar="myPoll"/>将创建一个可使用window.myPoll访问的javascript对象。如果包含表单被重新呈现(请参见“update”属性),则此属性将被覆盖。问题是在引擎盖下使用“window.setInterval”。如果在更换蜂之前不停止轮询器,则会丢失此间隔。

解:

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

  • 问题2
    poll.start()不会检查它是否已经在运行。两次调用将导致安排另一个间隔。第一个ID丢失了,但仍在向服务器发送请求。尝试快速单击“第一个对话框”中的按钮。

    解:

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

    07-26 04:04