Ajax 理解jsf中的组件范围存在问题。';id';推荐人?

Ajax 理解jsf中的组件范围存在问题。';id';推荐人?,ajax,jsf,scope,components,primefaces,Ajax,Jsf,Scope,Components,Primefaces,所以我很难理解JSF中组件的作用域。下面是我正在编写的一段代码示例。我有三个独立的面板,在第一个面板中我有一个primefaces日历组件。Primefaces为日历组件内置了AJAX,请注意“onSelectUpdate”和“selectListener” 在这种情况下,当日历被选中时,它在InputBean上运行listener方法,并用id=“scores”更新面板 在“分数”面板中有一个标准的jsf(不是primefaces)“selectOneListbox”,因为selectOneL

所以我很难理解JSF中组件的作用域。下面是我正在编写的一段代码示例。我有三个独立的面板,在第一个面板中我有一个primefaces日历组件。Primefaces为日历组件内置了AJAX,请注意“onSelectUpdate”和“selectListener”

在这种情况下,当日历被选中时,它在InputBean上运行listener方法,并用id=“scores”更新面板

在“分数”面板中有一个标准的jsf(不是primefaces)“selectOneListbox”,因为selectOneListbox没有内置的AJAX支持,我不得不在selectOneListbox中使用jsf
标记来获得所需的行为

我想做的是,一旦从selectOneListbox中选择了一个分数,让它更新到第三个面板

当使用日历组件测试第一个面板时,一切正常。然而,在测试第二个面板时,我得到了这个错误:(请记住,组件“j_idt24”是我所指的selectOneListbox)

包含未知id“scoreInfo”-无法在组件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中设置分数,这一切都非常有效

我现在为方法“handleScoreSelect”所做的就是更改“testString”的值,这样我就可以看到AJAX更新,但现在它甚至找不到第三个面板

是否有一种我在谷歌上找不到的特殊语法,可以从文档级别而不是“selectOneListbox”级别突破并读取

谢谢你的帮助

谢谢

注意-我是用打印纸手工输入代码的,因此如果有任何输入错误,我深表歉意。

试试以下语法:

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

问题在于
是一个“命名容器”。任何id都被视为在其所在的命名容器的范围内(并且ajax标记在表单内)。冒号告诉它从文档的根开始查找id,而不是从命名容器的根开始

有关详细信息,请参见此处的
findComponent()
方法的Javadoc:

尝试以下语法:

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

问题在于
是一个“命名容器”。任何id都被视为在其所在的命名容器的范围内(并且ajax标记在表单内)。冒号告诉它从文档的根开始查找id,而不是从命名容器的根开始

有关详细信息,请参见此处的
findComponent()
方法的Javadoc: