Primefaces, периодическое обновление при простое

Я хочу автоматически обновлять данные (на клиенте), когда пользователь бездействует. Я использую Primefaces 3.5 со стеклянной рыбой, и моя идея заключалась в следующем:

У меня есть переменная boolean autoUpdate в компоненте. И пользователь может включить/выключить автоматическое обновление.

Я создал два компонента: p:poll и p:idleMonitor.

idleMonitor имеет два события, которые запускают обновление

<p:ajax event="idle" oncomplete="myPoll.start();" />
<p:ajax event="active" oncomplete="myPoll.stop();" />

Эта часть в порядке. Проблема в том, как отключить idleMonitor, когда autoUpdate установлено на False? Когда я делаю

<h:panelGroup id="updatePanel" rendered="#{cc.attrs.bean.autoUpdate}">
....
</h:panelGroup>

это работает, только если я начинаю с autoUpdate = false и могу переключить режим только один раз. После рендеринга его нельзя изменить. я тоже пробовал

<p:ajax event="idle" oncomplete="#{cc.attrs.bean.autoUpdate ? 'myPoll.start();' : ''}" />

но это тоже не сработало. #{cc.attrs.bean.autoUpdate} никогда не меняется. Даже я вызываю upadte и вижу, что переменная изменилась в другом месте.

Итак, мой вопрос: есть ли способ отключить idleMonitor после его рендеринга? Или какое решение лучше для дополнительного периодического обновления для пользователя бездействующего?


person tvazac    schedule 25.07.2013    source источник
comment
Итак, вы хотите монитор бездействия, но только один раз? Вам не нужна эта опция, когда второй пользователь бездействует?   -  person Kishor Prakash    schedule 25.07.2013
comment
Нет, мне нужен монитор бездействия каждый раз, когда пользователь бездействует. Но только если у него autoUpdate установлено в True. Это означает, что он может переключаться между True и False во время сеанса без перезагрузки страницы.   -  person tvazac    schedule 26.07.2013
comment
Хм, вы пробовали p:outputPanel вместо h:panelGroup? Первая гармония лучше, это мое субъективное восприятие.   -  person Markus Schulte    schedule 06.08.2013


Ответы (1)


Ваша переменная autoUpdate оценивается только во время рендеринга. (при загрузке страницы)

#{cc.attrs.bean.autoUpdate}

Вот почему js не знает о его модификациях.

Решение 1, перерисуйте код js:

<p:ajax event="idle" update="afterIdle" />
<h:panelGroup id="afterIdle">
 <h:outputScript>
  if ('#{cc.attrs.bean.autoUpdate}' == 'true') 
   myPoll.start();
 </h:outputScript>
</h:panelGroup>

Решение 2: обновляйте переменную js при автообновлении (каким-то образом, например, с помощью remoteCommand):

<p:ajax event="idle" oncomplete="myFunction()" />
<script type="text/javascript">
 function myFunction(){
  if (jsAutoUpdate) myPoll.start();
 }
</script>

Решение 3: виджет primefaces idleMonitor имеет функцию stop(), которая останавливает мониторинг бездействия.

person steve    schedule 28.10.2013