значения флажков не сохраняются, когда конечные пользователи быстро нажимают несколько полей

#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>
 

Большое спасибо Адаму за это, поскольку я продолжал больше смотреть на внутренний код, а не на очевидную проблему в интерфейсном методе.