customValidator без обязательного валидатора?

Я борюсь с пользовательским валидатором для текстового поля. Кажется, что пользовательская проверка работает только ПОСЛЕ выполнения требуемой проверки. Это означает, что поле без requiredValidator не может быть проверено пользователем — это правда? Что я хочу сделать:

У меня есть текстовое поле. Значение требуется только в том случае, если выбрано конкретное значение в другом поле (здесь это группа флажков). Это зависимая проверка. Мой пользовательский валидатор работает нормально, пока текстовое поле не требуется, но это не должно иметь место.

флажок не имеет определенного значения -> текстовое поле может быть пустым
флажок содержит значение -> текстовое поле должно иметь значение.

Любые идеи?

    <xp:inputText id="inputText1" disableClientSideValidation="true">
</xp:inputText>

<xp:inputText id="inputText2" disableClientSideValidation="true">

    <xp:this.validators>
        <xp:customValidator message="err">
            <xp:this.validate><![CDATA[#{javascript:if(getComponentValue("inputText1").length>0 && getComponentValue("inputText2").length==0) postValidationError(this, "foo")}]]></xp:this.validate>
        </xp:customValidator>

    </xp:this.validators>
</xp:inputText>

Где getComponentValue — это метод получения значения с помощью getValue или getSubmittedValue от компонента, а postValidationError — это метод добавления сообщения о лицах.

ИЗМЕНИТЬ И ОКОНЧАТЕЛЬНЫЙ ОТВЕТ

Заключение и образец здесь: http://mardou.dyndns.org/Privat/osnippets.nsf/id/OBUE-95BLK4


person Oliver Busse    schedule 26.02.2013    source источник
comment
Предоставление примера кода того, что вы пытаетесь помочь получить ответы.   -  person TimWagaman    schedule 27.02.2013
comment
Да, верно, но это был мой первый пост, и я не был уверен, сколько кода я могу предоставить, поскольку это комбинация XSP, SSJS и других вещей, связанных с моим вопросом;) Я попытаюсь прояснить это, предоставив некоторые код - обещано! Мне просто нужно свести эту проблему к простой конструкции.   -  person Oliver Busse    schedule 27.02.2013
comment
Ваш валидатор не может работать: если inputText2 пуст, customValidator не запускается (просто добавьте что-нибудь в консоль, и вы поймете, что я имею в виду).   -  person Sven Hasselbach    schedule 27.02.2013
comment
Да, это проблема, но мне тоже не повезло с нужным валидатором. Можете ли вы дать мне подсказку для этого пути?   -  person Oliver Busse    schedule 27.02.2013
comment
Я добавил пример в свой ответ   -  person Sven Hasselbach    schedule 27.02.2013


Ответы (1)


Требуемый валидатор всегда является первым валидатором, который будет выполняться во время проверки. Это означает, что ответ на первую часть вашего вопроса ДА.

Но это не означает, что вам нужен обязательный валидатор для использования пользовательского валидатора: на эту часть вашего вопроса нужно ответить четким НЕТ.

Обязательный валидатор — это особый вид «хака», потому что валидатор выполняется только в том случае, если ваш компонент получает новое значение (то есть не пустое).

Я не уверен, почему у вас проблема с пользовательским валидатором - в описываемом вами сценарии вы просто используете обязательный валидатор...

ИЗМЕНИТЬ:

Просто «переверните свои валидаторы»: добавьте пользовательский валидатор из inputText2 в inputText1, и он должен работать.

РЕДАКТИРОВАТЬ 2:

<xp:inputText id="inputText1" disableClientSideValidation="true">
   <xp:this.validators>
      <xp:customValidator message="err">
         <xp:this.validate><![CDATA[#{javascript:
            var val = getComponent("inputText2").getSubmittedValue();
               if( val.equals("") == true )
                  return false;
               null}]]>
         </xp:this.validate>
      </xp:customValidator>
   </xp:this.validators>
</xp:inputText>

<xp:inputText id="inputText2" disableClientSideValidation="true" />
person Sven Hasselbach    schedule 26.02.2013
comment
Привет Свен! Спасибо за ваш пост! Это была моя первая попытка: использовать вычисляемый обязательный валидатор в зависимости от значения другого поля. Это не сработало. Пользовательский валидатор был предназначен для проверки значения первого поля, а затем для передачи нового сообщения о лицах, если второе поле пусто. - person Oliver Busse; 27.02.2013