Как с помощью JS очистить ошибки p:calendar

228
01 июля 2017, 12:47

Я написал JS функцию по очищению ошибок p:календарь, если были введены неверные данные в поле календаря (вручную заполнили поле календаря) - но она не работает. Цель - убрать ошибки валидации если пользователь очистил поле (на лету)

вот мой JSF сниппет

<div class="item">
    <p:outputLabel id="l_dateBirth" for="dateBirth" value="#{msgs['customerForm.dateBirth']}"/>
    <p:calendar id="dateBirth" widgetVar="dateBirthVar" value="#{customerBean.customer.dateOfBirth}"
                placeholder="MM/dd/yyyy"
                showOn="button" navigator="true"
                pattern="MM/dd/yyyy" yearRange="-120:+0"
                mindate="#{dateBean.minDate}" 
                maxdate="#{dateBean.maxDateOfBirth}"
                required="true" 
                requiredMessage="#{msgs['Error.dateBirth.mandatory']}"
                disabled="#{customerBean.mode eq 'EDIT'}">
                <f:ajax execute="@this" event="dateSelect" render="m_dateBirth" />
                <p:ajax event="keyup" oncomplete="hideCustomerCalendarErrMsg('dateBirth')" />
                <f:validator binding="#{dateOfBirthValidator}"/>
                </p:calendar><p:message id="m_dateBirth" for="dateBirth" display="text"/>
</div>

вот мой JS

function hideCustomerCalendarErrMsg(variable) {
var inputField, msg;
inputField = PF('dateBirthVar').getDate();
msg = document.getElementById("createEditCustomerForm:accordion:m_" + variable);
if (inputField.value === null) {
    msg.innerHTML = "";}}
Answer 1

Не надо делать ajax там, где он не нужен. Компоненты из набора Primefaces часто имеют возможность навешать клиентские обработчики на разные события.

Другой приём использует возможность биндинга компонентов jsf.
Причём не обязательно создавать свои классы-бины для этого. Достаточно придумать название и объект будет автоматически размещён в RequestScope.
Таким нехитрым образом, благодаря binding="#{dateBirthMsg}", компонент мессаги каждый раз будет доступен в RequestScope под именем dateBirthMsg.

Что нам это даёт?
Мы теперь можем ссылаться на этот компонент и его свойства в jsf.
Свойство clientId позволяет сильно упростить скрипты, где нужен id элемента html. Ибо оно и есть этот самый id, и никаких заумных вычислений, чреватых ошибками, не требуется.
Просто пишем #{dateBirthMsg.clientId} там, где скрип должен увидеть id элемента, соответствующего мессаге о дне рождения.

<p:calendar ... 
            onkeyup="document.getElementById('#{dateBirthMsg.clientId}').innerHTML=''">
    <p:ajax event="dateSelect" update="m_dateBirth"/>
</p:calendar>
<p:message id="m_dateBirth" for="dateBirth" display="text" binding="#{dateBirthMsg}"/>

И ещё. Нет никаких причин использовать для одного события p:ajax, а для второго f:ajax. А если захотите использовать три события? Какой тогда ajax для третьего? На самом деле можно одновременно использовать сколь угодно много и p:ajax и f:ajax для разных событий (и возможно даже для одного и того же, надо уточнить).

READ ALSO
Fabrik &gt; Как прервать создание элементов с определенным классом

Fabrik > Как прервать создание элементов с определенным классом

Используется компонент Fabrik, он создает элемент календарь для всех элементов с датой

197
Полосатая таблица

Полосатая таблица

Нужно сделать полосатую таблицуВсе было бы довольно просто, но мою таблицу генерирует js с помощтю такого метода:

210
Подсчет количества введенных данных Angular2

Подсчет количества введенных данных Angular2

Ребят, помогите пожалуйста, недавно начал изучать typescript, как и angularВопрос в следующем, у меня есть виды данных d, f, b которые я ввожу в инпуты

199
Scanning directory using path which contains spaces

Scanning directory using path which contains spaces

Что нужно сделать, чтобы функция scandir заработала с путями в которых есть пробелы

213