2

考虑以下形式:
1. 用户从 selectOneMenu "selectorDB" 中选择一个值
2. Ajax 调用返回第二个 selectOneMenu 的项目并渲染整个“第二个” panelGroup
3. 用户从第二个 selectOneMenu 中选择一个值
4. Ajax 调用返回放置在 inputText 和 panelGroup 内的 String ,其中包含呈现的 inputText 。

一切正常,直到我没有从第二个 selectOneMenu 中选择一个值。Ajax 的第四个动作甚至没有被调用。我放置了几个控制台 System.outs 来检查是否调用了侦听器并且什么也没有。

有可能做出像我正在尝试做的事情吗?
感谢您的任何回复。

*.jsf:

<h:form>
    <h:panelGroup id="first">
        <h:outputLabel value="Select a database to make queries against" for="selectorDB" />
        <h:selectOneMenu id="selectorDB" value="#{sparqlQuerier.chosenRing}">
            <f:selectItem itemLabel="Select..." itemValue="0" /> 
            <f:selectItems value="#{sparqlQuerier.ringTitles}" />
            <f:ajax render="second third" listener="#{sparqlQuerier.firstListener}"/>
        </h:selectOneMenu>
    </h:panelGroup>
    <br />
    <h:panelGroup id="second">
        <h:outputLabel rendered="#{sparqlQuerier.doRenderSecond}" value="Select a query to execute" for="selectorQuery" />
        <h:selectOneMenu rendered="#{sparqlQuerier.doRenderSecond}" id="selectorQuery" value="#{sparqlQuerier.chosenQuery}">
            <f:selectItem itemLabel="Select..." itemValue="0" />
            <f:selectItems value="#{sparqlQuerier.queries}" />
            <f:ajax render="third" listener="#{sparqlQuerier.secondListener}"/>
        </h:selectOneMenu>
    </h:panelGroup>
    <br />
    <h:panelGroup id="third">
        <h:inputText rendered="#{sparqlQuerier.doRenderThird}" value="#{sparqlQuerier.queryBody}" onfocus="if (this.value == '#{sparqlQuerier.queryBody}') {this.value = '';}" onblur="if (this.value == '') {this.value ='#{sparqlQuerier.queryBody}';}" />
    </h:panelGroup>
</h:form>

豆:

public void firstListener(AjaxBehaviorEvent event) 
{
    doRenderThird = false;
    doRenderSecond = false;
    if(chosenRing!=0)
    {
            doRenderSecond = true;
            try 
            {
                // returning rows from the database...
            } 
            catch (SQLException e) 
            {
                e.printStackTrace();
            }
    }
}
public void secondListener(AjaxBehaviorEvent event) 
{
    doRenderThird=false;
    if(chosenQuery!=0)
    {
        if(chosenQuery==-1)
        {
            queryBody="body #1";
        }
        else
        {
            queryBody="body #2";
        }
        doRenderThird=true;
    }
    System.out.println(chosenQuery);
    System.out.println(doRenderThird);
}
4

0 回答 0