JSF2 - какая область применения для элементов f: ajax? - PullRequest
1 голос
/ 23 марта 2010

У меня есть эта форма:

<h:form>
    <h:outputText value="Tag:" />   
    <h:inputText value="#{entryRecorder.tag}">
        <f:ajax render="category" />
    </h:inputText>
    <h:outputText value="Category:" />
    <h:inputText value="#{entryRecorder.category}" id="category" />
</h:form>

Чего я добиваюсь: при вводе в поле «тег» поле entryRecorder.tag обновляется в соответствии с тем, что было введено. По некоторой логике после этого действия бин также обновляет свое поле category. Это изменение должно быть отражено в форме.

Вопросы:

  1. Какую область я должен использовать для EntryRecorder? Запрос может быть неудовлетворительным для нескольких запросов AJAX, хотя сеанс не будет работать с несколькими окнами браузера за один сеанс.
  2. Как я могу зарегистрировать мое действие updateCategory() в EntryRecorder, чтобы оно запускалось при обновлении компонента?

Ответы [ 2 ]

0 голосов
/ 31 марта 2010

В пункте 1 я буду использовать Request, поскольку нет необходимости использовать View, а Session, как вы хорошо заметили, совершенно не нужен.

Для пункта 2, поскольку вы используете , я предлагаю использовать его в полной мере. Вот мое предложение:

XHTML:

<h:form>
    <h:outputText value="Tag:" />
    <h:inputText value="#{entryRecorder.tag}">
        <f:ajax render="category" event="valueChange"/>
    </h:inputText>
    <h:outputText value="Category:" />
    <h:inputText value="#{entryRecorder.category}" id="category" />
</h:form>

Обратите внимание на использование события valueChange вместо размытия (не то, чтобы размытие не работало, но я считаю valueChange более подходящим для компонента-держателя значения)

боб:

@ManagedBean
@RequestScoped
public class EntryRecorder {
    private String tag;
    private String category;

    public String getCategory() {
        return category;
    }

    public String getTag() {
        return tag;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public void setTag(String tag) {
        this.tag = tag;
        tagUpdated();
    }

    private void tagUpdated() {
        category = tag;
    }
}

Если вы действительно не хотите, чтобы метод tagUpdated выполнялся только при обновлении тега через представление, мое предложение выглядит более понятным. Вам не нужно иметь дело с событиями (или приведениями), и метод tagUpdated может быть закрытым, скрывая его функциональность от возможных злоупотреблений.

0 голосов
/ 23 марта 2010

Точка ответа 2:

<h:inputText styleClass="id_tag" value="#{entryRecorder.tag}"
    valueChangeListener="#{entryRecorder.tagUpdated}">
    <f:ajax render="category" event="blur" />
</h:inputText>

Bean:

@ManagedBean
@ViewScoped
public class EntryRecorder {
    private String tag;
    private String category;
    @EJB
    private ExpenseService expenseService;

    public void tagUpdated(ValueChangeEvent e) {
        String value = (String) e.getNewValue();
        setCategory(expenseService.getCategory(value));
    }
}

Номер 1, кто-нибудь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...