2014-01-14 4 views
0

Я создаю приложение, которое позволяет пользователям управлять задачей. Доступ к экрану мониторинга задач можно получить двумя пользователями: одновременно. Каждый пользователь может увидеть, запущена ли задача в данный момент, и может либо остановить ее, либо запустить. Всякий раз, когда один пользователь запускает/останавливает задачу, другой пользователь должен увидеть изменение состояния задачи на своем собственном экране.Почему не Primefaces не обновляет мою кнопку?

Однако код, который я построил, не работает. Когда пользователь запускает задачу, экран другого пользователя пытается немедленно остановить задачу. Затем начинается какая-то «война»: экран первого пользователя повторно активирует задачу, а второй пользователь повторно останавливает задачу и так далее.

Как я могу избежать этой войны?

Вот мой код:

taskMonitoring.xhtml

<p:poll 
     interval="5" 
     process="sbbActivateTask" /> 

<h:outputLabel 
     value="Activate task:" /> 

<p:selectBooleanButton 
     id="sbbActivateTask" 
     value="#{taskBean.state}" 
     onLabel="YES" 
     offLabel="NO" 
     valueChangeListener="#{taskBean.switchTask}"/> 

TaskBean.java

@ManagedBean(name = "taskBean") 
@ViewScoped 
public class TaskBean { 

    public void setState(boolean b) { 
     // I deliberately put nothing here ... 
    } 

    public boolean getState() { 
     return TaskManager.getState(); 
    } 

    public void switchTask() { 
     TaskManager.switchTask(); 
    } 
} 

ответ

1

Я предположил бы, что, когда опрос вызывает и обновляет <selectBooleanButton>, он видит изменения и срабатывает valueChangeListener, s вернув его, таким образом, состояние гонки. Я бы предпочел не смешивать состояние и команду в одном контроле.

Мое предложение: тот же код, что и showcase of the component. I.e .:

<p:selectBooleanButton 
    id="sbbActivateTask" 
    value="#{taskBean.state}" 
    onLabel="YES" 
    offLabel="NO" 
> 
    <p:ajax listener="#{taskBean.switchTask}"/> 
</p:selectBooleanButton> 

Таким образом, действие будет активироваться только тогда, когда пользователь на самом деле нажимает кнопку.

Для того, чтобы кнопка для обновления визуально, вам нужно будет добавить атрибут update к poll:

<p:poll 
    interval="5" 
    process="sbbActivateTask" 
    update="selectBooleanButton" /> 
+0

Я добавил р: Ajax, но теперь этот метод не срабатывает, когда я нажимаю BooleanButton. Что мне не хватает? – Stephan

+0

Я нашел проблему: TaskBean отсутствовал метод setState. Однако гонка закончилась, но кнопка не обновляется, несмотря на p: poll ... – Stephan

+0

Правильное наблюдение. Вам нужно будет использовать '', см. Edit. –

Смежные вопросы