несколько вызовов f: ajax в нескольких h: selectOneMenu - PullRequest
2 голосов
/ 24 марта 2012

Рассмотрите следующую форму:
1. Пользователь выбирает значение из selectOneMenu "selectorDB"
2. Ajax-вызов возвращает элементы для второго selectOneMenu и создает всю «вторую» группу панелей.
3. Пользователь выбирает значение из второго selectOneMenu
4. Ajax-вызов возвращает String, которая находится внутри inputText, и panelGroup, которая содержит визуализированный inputText.

Все работает нормально, пока я не выбрал значение из второго selectOneMenu. Аякс четвертого действия даже не называется. Я поместил пару консольных 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);
}
...