2014-12-04 2 views
1

У меня есть список элементов, которые показываются с помощью час: DataTable так:PostValidate DataTable список значений

<p:dataTable value="#{myBean.instructorsList}" var="ins"> 
    <p:column headerText="Name"> 
     <h:inputText value="#{ins.name}"/>         
    </p:column> 
</p:dataTable> 

Мой спецификации, что я не могу позволить преподавателю иметь такое же имя, как другой insturctor. Поэтому мне нужно иметь доступ ко всему списку инструкторов, когда он отправлен. Я попытался проверить использование postValidate f: event, однако из-за жизненного цикла JSF он не обновляет значения модели до фазы postValidation.

Моя попытка

<f:event listener="#{myBean.myMethod}" type="postValidate" /> 

Подложка код

private List<instructors> instructorsList; 

public void myMethod(ComponentSystemEvent event) { 

    // Attempting to use the instructorsList with new values. However, this 
    // is at the wrong stage 
} 

Как бы я написать валидатор для выполнения проверки дублирующих имен инструктора?

+0

Я не уверен, что понимаю проблему. У вас есть проблема с доступом к предоставленному имени из приглашения postValidate? Или у вас есть проблема с настройкой статуса проверки в слушателе? – kolossus

+0

Да, у меня есть проблема с доступом к именам отправки из прослушивателя событий postValidate. Значения еще не обновлены в моем представлении. Скопированный компонент. – Sixthpoint

+0

postValidate, вероятно, слишком поздно, чтобы повлиять на обработку запроса. Как именно вы пытаетесь получить доступ к представленному значению в настоящее время? – kolossus

ответ

0

Внутри слушателя используйте метод getSubmittedValue на HtmlInputText, чтобы вытащить значение прямо из компонента. Кроме того, postValidate семантически поздно, чтобы вызвать проблемы в процессе проверки. Используйте вместо этого метод preValidate. В общем, вы должны иметь

public void myMethod(ComponentSystemEvent event) { 
     HtmlInputText txtBox = (HtmlInputText)event.getComponent(); 
     String theValue = txtBox.getSubmittedValue().toString(); //the value in the textbox 

     //based on the outcome of your validation, you also want to do the following 

     FacesContext.getCurrentInstance().setValidationFailed(); //flag the entire request as failing validation 
     txtBox.setValid(false); //mark the component as failing validation 

    } 

EDIT: Такой подход в значительной степени зависело от той предпосылки, что пользователи будут представлять только одну строку за один раз. В случае, когда вся таблица/столбец отправляется по одному запросу, вы обнаружите, что оценка каждого поля ввода на единицу не делает многого для предотвращения условий гонки; вместо этого вы должны смотреть на проверку поперечного поля.

EDIT 2: Я ошибался, вы не можете иметь условия гонки, когда вызывается прослушиватель событий. Слушатель выполняется для каждой строки последовательно. Это позволяет вам безопасно проверять каждую строку (возможно, против Map, для дубликатов), не беспокоясь о состоянии гонки.

+0

хороший ответ, как бы я сделал проверку поперечного поля? Это то, что я действительно ищу, как сделать. Мне не нужно проверять поля на индивидуальной основе. – Sixthpoint

+0

См. Мое редактирование @Sixthpoint – kolossus

+0

Это удовлетворило бы мои требования, поскольку я мог бы использовать Map в качестве точки проверки, а затем поддерживать подсчет количества полей, которые были проверены. Если я дойду до конца и условие не выполнено, я могу аннулировать последнее поле (или выбросить ошибку проверки), чтобы остановить жизненный цикл. – Sixthpoint

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