理解 jsf 中的组件范围的问题。'id'参考需要特殊语法吗?



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

在本例中,当选择日历时,它在InputBean上运行侦听器方法,并使用id="scores"更新面板

在"scores"面板中有一个标准的jsf(不是primefaces)"selectOneListbox"由于没有内置AJAX对selectOneListbox的支持,我被迫在selectOneListbox中使用JSF <f:ajax>标记,以获得所需的行为。

我想发生的是,一旦一个分数从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"简单地从数据库中获取分数列表,给定所选日期,然后将其设置在名为"scores"的ArrayList中——这一切都工作得很好。

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

是否有一种特殊的语法,我可以使用,我还没有能够在谷歌上找到,一个可以从文档级别而不是"selectOneListbox"的级别爆发和读取?

谢谢你的帮助。

感谢

注:-我用手从打印的纸上输入代码,所以如果有任何打字错误-我道歉。

试试这个语法:

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

问题是<h:form>是一个"命名容器"。任何id都被视为在它所在的命名容器的范围内(ajax标记在表单内)。冒号告诉它从文档的根开始查找id,而不是从命名容器的根开始。

参见Javadoc中findComponent()方法的详细信息:http://download.oracle.com/javaee/6/api/javax/faces/component/UIComponent.html findComponent(以)

相关内容

  • 没有找到相关文章

最新更新