Передача динамического значения составному компоненту и использование его в качестве атрибута [duplicate]

Sublime Text 3

Если это произойдет, если вы код в Sublime Text 3, это может помочь вам с проблемами с отступом

В Sublime Text при редактировании файла Python:

Меню Sublime Text > Настройки > Настройки - Синтаксис Конкретный :

Python.sublime-settings

{
    "tab_size": 4,
    "translate_tabs_to_spaces": true
}
5
задан BalusC 3 July 2015 в 11:39
поделиться

1 ответ

Это вызвано использованием <f:validateRegex>, свойства которого зависят от текущего итерационного элемента <ui:repeat>.

Тегами <f:xxx> являются обработчики тегов, а не компоненты пользовательского интерфейса. Обработчики тегов анализируются и оцениваются, когда дерево компонентов пользовательского интерфейса должно быть построено во время времени сборки. Все EL оцениваются во время сборки представления. Тегами <h:xxx> и некоторыми <ui:xxx> тегами, такими как <ui:repeat>, являются компоненты пользовательского интерфейса. Все их EL оцениваются во время визуализации рендеринга.

Итак, в вашем случае, когда <f:validateRegex> получает синтаксический анализ и выполняется, #{field} недоступен в текущей области EL и, следовательно, оценивается как null .

Существует несколько способов заставить его работать.

  • Переместить валидатор в класс, представляющий Field, и ссылаться на него следующим образом:
    <h:inputText ... validator="#{field.validate}" />
    
    с классом Field, в котором вы его вручную создаете:
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        if (pattern != null) {
            RegexValidator regexValidator = new RegexValidator();
            regexValidator.setPattern(pattern);
            regexValidator.validate(context, component, value);
        }
    }
    
  • Или оберните #{eventMgmt.eventFields} в ListDataModel<Field> и привяжите валидатор к компоненту #{eventMgmt}. Таким образом, вы сможете установить свойства валидатора на основе данных строки:
    <h:inputText ... validator="#{eventMgmt.validate}" />
    
    в классе базового компонента позади #{eventMgmt}:
    private DataModel<Field> model;
    private RegexValidator regexValidator;
    
    @PostConstruct
    public void init() {
        regexValidator = new RegexValidator();
    }
    
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        String pattern = model.getRowData().getPattern();
    
        if (pattern != null) {
            regexValidator.setPattern(pattern);
            regexValidator.validate(context, component, value);
        }
    }
    
  • Или создать пользовательский Validator, который расширяет RegexValidator и устанавливает шаблон как пользовательский атрибут компонента <f:attribute> и позволяет перехватить Validator. <f:attribute> в основном добавляет новый атрибут к компоненту с неоцененным ValueExpression, поэтому он будет переоценен при его вызове. Например:
    <h:inputText ...>
        <f:validator validatorId="extendedRegexValidator" />
        <f:attribute name="pattern" value="#{field.pattern}" />
    </h:inputText>
    
    с
    @FacesValidator("extendedRegexValidator")
    public class ExtendedRegexValidator extends RegexValidator {
    
        @Override
        public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
            String pattern = (String) component.getAttributes().get("pattern");
    
            if (pattern != null) {
                setPattern(pattern);
                super.validate(context, component, value);
            }
        }
    
    }
    
  • Или, если вы используете библиотеку служебных программ JSF OmniFaces , используйте ее <o:validator> . Например.
    <h:inputText ...>
        <o:validator validatorId="javax.faces.RegularExpression" pattern="#{field.pattern}" />
    </h:inputText>
    
    Да, вот и все. <o:validator> будет следить за тем, чтобы все атрибуты оценивались как отложенные выражения вместо непосредственных выражений.

См. Также:

12
ответ дан Community 25 August 2018 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: