Атрибуты компонента не устанавливаются после «reRender» в запросе AJAX - PullRequest
1 голос
/ 12 ноября 2010

В настоящее время я работаю над некоторым сложным веб-интерфейсом и реализую его, используя:

  • JSF 1.2
  • Facelets 1.1.15
  • RichFaces 3.3.3.Final

Я создал пользовательский компонент JSF, который позволяет проверять поля inputText с использованием чистого JavaScript.Этот компонент имеет только один атрибут: тип.Этот атрибут отвечает за алгоритм проверки, который будет применяться в тот момент, когда пользователь нажимает клавишу клавиатуры.

На этапе restoreView, когда создается начальный вид, этот атрибут устанавливается JSF (фактически Facelets).Это означает, что у меня есть класс компонента с сеттером и геттером для атрибута «тип».И установщик типа, вызываемый со значением, указанным в документе xhtml.

Компонентный объект воссоздается каждый раз на этапе restoreView, если я указываю их в атрибуте reRender.Но когда он воссоздается, мой требуемый тип атрибута не устанавливается.Это просто создает новые компоненты компонентов ... и это все.Может быть, я чего-то не понимаю, и это нормальное поведение, но как получить значения атрибутов в этом случае?

Код:

Простая тестовая страница:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:u="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:a="http://richfaces.org/a4j"
      xmlns:r="http://richfaces.org/rich"
      xmlns:v="http://nobodyhere.ru/jsf/validation">
    <head>
        <title>Test Page</title>
    </head>
    <body>
        <h:form id="testForm">
            <h:inputText id="textInput" value="test">
                <v:keyValidator type="time"/>
            </h:inputText>
            <a:commandButton value="Make AJAX request" reRender="testForm"/>
        </h:form>
    </body>
</html>

Класс компонента:

public class KeyValidator extends UIComponentBase
{

    public KeyValidator()
    {
        System.out.println("new KeyValidator");
    }

    public KeyValidatorType getValidatorType()
    {
        return type;
    }

    public String getType()
    {
        return getValidatorType().toString();
    }

    public void setType(String type)
    {
        this.type = KeyValidatorType.valueOf(type.toUpperCase());
    }

    @Override
    public String getFamily()
    {
        return KeyValidator.class.getName();
    }

    private KeyValidatorType type;
}

Когда я нажимаю кнопку «Сделать запрос AJAX», мой компонент воссоздается.Но атрибут 'type' не установлен в компоненте.

Основная проблема начинается с фазы renderView в компонентном рендерере, когда вызывается encodeBegin, он пытается получить этот атрибут и, конечно, получает null вместо правильного значения.

ТакВозможно, более точный вопрос:
Как получить значения атрибутов компонента по запросу AJAX на renderView фазе?

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 12 ноября 2010

Вы должны переопределить saveState и restoreState в компоненте, чтобы сохранить и восстановить необходимые атрибуты.

Удачи!

...