2012-03-28 4 views
1

В моем приложении jsf я хочу проверить поле, которое должно быть проверено только при проверке одного параметра в SelectOneRadio.JSF 2.0; Тег валидатора «отключен» зависит от значения со страницы

Я узнал, что <f:validator> имеет атрибут, называемый «отключен».

Могу ли я использовать это, чтобы проверить значение из другого поля?

Я пробовал, но у меня нет доступа к значению из моего компонента.

<h:selectOneRadio value="#{myBean.checkedSelectOneRadioValue}"> 
    <f:selectItems value="#{myBean.valuesForSelectOneRadio}" /> 
</h:selectOneRadio> 


<f:validator validatorId="myValidator" disabled="#{myBean.checkedSelectOneRadioValue == 'TEST'}" /> 

Есть ли какой-либо способ достичь этого без написания собственного валидатора?

Спасибо!

+0

Ваш чек на внешний вид инвалидов несколько подозрительными, не должен он быть # {myBean.checkedSelectOneRadioValue == 'TEST'} "или это просто опечатка (перемещенная фигурная скобка)? – Volker

+0

Я тоже пробовал вашу версию, и она не работает. Может быть, что в этот момент проверки значение из SelectOneRadio не сохраняется в bean? – Tobi

+0

Попробуйте установить partialSubmit = "true" в теге selectOneRadio, который должен подсчитать значение. – Volker

ответ

0

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

Сначала это должно быть

disabled="#{myBean.checkedSelectOneRadioValue == 'TEST'}

или

disabled="#{myBean.checkedSelectOneRadioValue eq 'TEST'}

Дополнительная информация, по крайней мере, в ICEFaces (и MyFaces должна иметь эту функцию, чтобы о), вы можете использовать:

<h:selectOneRadio value="#{myBean.checkedSelectOneRadioValue}" partialSubmit="true"> <f:selectItems value="#{myBean.valuesForSelectOneRadio}" /> </h:selectOneRadio>

Это должно заставить AJAX запрос после изменения значения selectoneradio и валидатор отключенной проверки должны быть в состоянии получить его из фасоли.

Если это не работает, может быть AutoSubmit или подобные в MyFaces ...

+0

Не работает :-(Я попытался с partialSubmit, с eq и с ==, но валидатор не будет работать так, как я ожидаю. По крайней мере, я попытался установить «TEST» на null, и он сработал. Выбранное значение не будет записано в bean-компонент. Могу ли я использовать valueChangeListener для хранения значения в bean-компоненте? – Tobi

+0

В каком компоненте вы используете валидатор • Есть ли у него частичные сущности, непосредственные действия или что-то еще? Является ли новое значение не записано в ваш компонент или ваше представление не получает его обратно? – Volker

+0

Валидатор находится в файле ввода. Должен ли быть атрибут partialSubmit? – Tobi

0

С JSF 2.0 вы можете использовать f:ajax для частичного представить. Добавьте этот тег в h:selectOneRadio:

<h:selectOneRadio value="#{myBean.checkedSelectOneRadioValue}"> 
    <f:ajax render="idOfInputText"/> 
    <f:selectItems value="#{myBean.valuesForSelectOneRadio}" /> 
</h:selectOneRadio> 
... 
<h:inputText id="idOfInputText"> 
    <f:validator validatorId="myValidator" 
       disabled="#{myBean.checkedSelectOneRadioValue eq 'TEST'}" /> 
</h:inputText> 

Заменить содержание render атрибута с реальным идентификатором вашего поля ввода с валидатора. Это предполагает, что selectOneRadio и inputText находятся внутри одного и того же NamingContainer.

+0

Я тоже пробовал этот пример, но он не работает. Теперь я верю, здесь что-то странное происходит: -/Мне нужно использовать привязку для selectoneradio и/или inputtext? – Tobi

+0

Наконец-то я нашел решение. Теперь я буду проверять в myBean, и все работает так, как ожидалось. Спасибо за помощь !!! – Tobi

6

<f:validator> - обработчик тега, а не компонент пользовательского интерфейса. Все его атрибуты относятся к определению, оцениваемому во время создания времени просмотра, а не во время отображения рендеринга. Время сборки представления - это тот момент, когда файл XHTML анализируется в дереве компонентов JSF, как доступно context.getViewRoot(). Тот же вид обычно повторно используется через обратную передачу в тот же вид, возвращая null/void в (ajax) действиях.

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

E.g.

<h:inputText> 
    <f:validator validatorId="myValidator" /> 
    <f:attribute name="radio" value="#{myBean.checkedSelectOneRadioValue}" /> 
</h:inputText> 

с

@Override 
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {  
    if (!"TEST".equals(component.getAttributes().get("radio"))) { 
     return; 
    } 

    // Perform actual validation here. 
} 

Вы можете также использовать в качестве альтернативы OmniFaces<o:validator> вместо этого. Он расширяет стандарт <f:validator> с оценкой EL по атрибутам на основе запроса.

<h:inputText> 
    <o:validator validatorId="myValidator" disabled="#{bean.checkedSelectOneRadioValue == 'TEST'}" /> 
</h:inputText> 

Смотри также showcase example и source code, из которого экстракт уместности размещен ниже:

@Override 
public void apply(FaceletContext context, UIComponent parent) throws IOException { 
    if (!ComponentHandler.isNew(parent)) { 
     return; 
    } 

    final javax.faces.validator.Validator validator = createValidator(context); 
    final RenderTimeAttributes attributes = collectRenderTimeAttributes(context, validator); 
    final ValueExpression disabled = getValueExpression(context, "disabled", Boolean.class); 
    ((EditableValueHolder) parent).addValidator(new javax.faces.validator.Validator() { 

     @Override 
     public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
      if (disabled == null || Boolean.FALSE.equals(disabled.getValue(context.getELContext()))) { 
       attributes.invokeSetters(context.getELContext(), validator); 
       validator.validate(context, component, value); 
      } 
     } 
    }); 
} 
+0

'' сделал мой день! – ForguesR

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