Проблема понимания компонентных областей в JSF.Специальный синтаксис, необходимый для ссылки 'id'? - PullRequest
1 голос
/ 04 августа 2011

Так что мне сложно понять область действия компонентов в JSF.Вот пример кода, над которым я работаю.У меня есть три отдельные панели, на первой панели у меня есть компонент календаря простых лиц.Primefaces имеет встроенный AJAX для компонента календаря, обратите внимание на «onSelectUpdate» и «selectListener».

В этом случае, когда выбран календарь, он запускает метод слушателя на InputBean и обновляет панель с помощьюid = "scores"

Внутри панели "Score" есть стандартная jsf (не простейшие) "selectOneListbox", так как нет встроенной поддержки AJAX для selectOneListbox, я вынужден использовать JSF <f:ajax> тег внутри selectOneListbox, чтобы получить желаемое поведение.

То, что я хотел бы получить, - это когда счет выбирается из selectOneListbox, чтобы обновить третью панель.

При тестировании первой панели с компонентом календаря все работало простохорошо.Однако при тестировании второй панели я получаю эту ошибку: (имейте в виду, что компонент "j_idt24" - это selectOneListbox, на который я ссылаюсь)

<f:ajax> contains an unknown id 'scoreInfo' - cannot locate it in the context of the component j_idt24

Вот мой файл xhtml:

<?xml version='1.0' encoding='UTF-8'>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
     xmlns:h="http://java.sun.com/jsf/html"
     xmlns:f="http://java.sun.com/jsf/core"
     xmlns:p="http://primefaces.prime.com.tr/ui"
     xmlns="http://www.w3.org/1999/xhtml">
   <p:panel style="position: relative">
        <h:form>
             <h:panelGrid columns="2" border="0">
                  Date: <p:calendar value="#{inputBean.scoresDate}" mode="popup" popupIconOnly"true" showOn="button" selectListener="#{inputBean.handleDateSelect}" onSelectUpdate="scores"/>
             </h:panelGrid>
        </h:form>
   </p:panel>
   <p:panel style="position: relative" id="scores">
        <h:form>
              <h:selectOneListbox value="#{inputBean.score}" size="10">
                   <f:ajax event="change" render="scoreInfo" listener="#{inputBean.handleScoreSelect}"/>
                   <f:selectItems value="#{inputBean.scores}" var="score" itemLabel="#{score.displayString}" itemValue="scoreId"/>
              </h:selectOneListbox>
        </h:form>
   </p:panel>
   <p:panel style="position: relative" id="scoreInfo">
       <h:inputText value="#{inputBean.testString}"/>
   </p:panel>
</ui:composition>

Для InputBean метод handleDateSelect просто получает список оценок из базы данных с учетом выбранной даты, а затем устанавливает в массив ArrayList с именем «scores» - все это прекрасно работает.

Всея делаю прямо сейчас, потому что метод handleScoreSelect изменяет значение testString, чтобы я мог видеть обновление AJAX, но сейчас он не может даже найти 3-ю панель.

Есть лиспециальный синтаксис, который я могу использовать, который я не смог найти в Google, такой, который может выделяться и считываться с уровня документа вместо уровня «selectOneListbox»?

Ваша помощь приветствуется.

Спасибо

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

1 Ответ

1 голос
/ 05 августа 2011

Попробуйте этот синтаксис:

<f:ajax 
    event="change" 
    render=":scoreInfo" 
    listener="#{inputBean.handleScoreSelect}" />

Проблема в том, что <h:form> является «контейнером именования».Любой идентификатор рассматривается как находящийся внутри области именования контейнера, внутри которого он находится (а ваш тег ajax находится внутри формы).Двоеточие говорит ему начинать поиск идентификатора в корне документа, а не в корне контейнера имен.

Подробнее см. Javadoc для метода findComponent(): http://download.oracle.com/javaee/6/api/javax/faces/component/UIComponent.html#findComponent(java.lang.String)

...