#java #jsf #primefaces
#java #jsf #простые
Вопрос:
У меня возникла проблема, когда пользователи быстро проверяют второстепенные проекты как завершенные, и они нажимают на некоторые поля с интервалом в миллисекунды, что приводит к тому, что значения не сохраняются. Я не уверен, как лучше поступить, поскольку я не уверен в проблеме. Щелчки сохраняются, если они замедляются, но в журналах не указывается никаких ошибок при их ускорении.
Флажок с использованием primefaces:
<p:column styleClass="datatable-column-small" sortBy="#{task.complete}" headerText="Complete">
<h:panelGroup styleClass="panel-group-center">
<p:selectBooleanCheckbox value="#{task.complete}">
<p:ajax listener="#{cc.attrs.managedBean.toggleCheckbox(task)}" update="@form "/>
</p:selectBooleanCheckbox>
</h:panelGroup>
</p:column>
Компонент:
public void toggleCheckbox(VerificationTaskEntity task) {
if (isReadyForTaskUpdate()) {
logger.info("Task checkbox updated");
// check if task is complete and remove simulated and follow up date if so - also prevents inputs in these fields if complete
if (task.isComplete() == true) {
task.setSimulated(false);
task.setFollowUpDate(null);
}
else if (task.getSimulated() != null amp;amp; task.getFollowUpDate() == null) {
// check if task was set to simulated and automatically set a follow-up date if so
if(task.getSimulated() == true) { task.setFollowUpDate(new Date());}
else { task.setFollowUpDate(null);}
}
getTaskService().updateTask(task);
}
else {
String warnMessage = "Project not ready for verification. Please update required fields in project.";
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,WARN_SUMMARY,warnMessage));
}
}
Комментарии:
1. Должен сказать, я ничего не знаю о первичных элементах, однако, посмотрев на ваш код и прочитав проблему, я подозреваю, что проблема в том, что пользователи «быстрого нажатия» попадают в ваш код внутри
if (isReadyForTaskUpdate())
блока, поэтому не будут пойманы уловом. Есть ли в этом смысл? Чтобы проверить, вы могли бы поместить внутренний блок try / catch в if?2. Существует время обхода, когда представление будет обновлять и извлекать значения, что в данном случае приводит к перезагрузке JSF раздела представления, содержащего форму. Это может произойти во время взаимодействия с пользователем. Если вы обновите всю форму целиком, это именно то, чего вы ожидаете. В этом конкретном случае у вас есть слушатель непосредственно в теге ajax, поэтому я думаю
update="@this"
, что это следует решить в вашем конкретном случае. Однако, не видя больше кода, я не знаю, сработает ли это для вас.3. Представьте себе эту последовательность событий. 1. Срабатывает запрос ajax. 2. JSF начинает обновлять представление, и в тот момент, когда пользователь нажимает на другой флажок. 3. Из
update="@form"
-за обновлений всей формы — перезапись взаимодействия с пользователем.
Ответ №1:
Адам в разделе комментариев на месте. Простой недосмотр с моей стороны. Я исправил код, чтобы отразить соответствующий экземпляр для обновления.
<p:column styleClass="datatable-column-small" sortBy="#{task.complete}" headerText="Complete">
<h:panelGroup styleClass="panel-group-center">
<p:selectBooleanCheckbox value="#{task.complete}">
<p:ajax listener="#{cc.attrs.managedBean.toggleCheckbox(task)}" update="@this "/>
</p:selectBooleanCheckbox>
</h:panelGroup>
</p:column>
Большое спасибо Адаму за это, поскольку я продолжал больше смотреть на внутренний код, а не на очевидную проблему в интерфейсном методе.