所以我很难理解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(以)