два богатых: проблемы конфликта ajax (в 3 богатых: выберите элементы управления) - PullRequest
1 голос
/ 12 марта 2012

У меня есть 3 rich: выберите элементы управления с идентификатором select1, select2, select3.Я хочу нажать на select1, будет отображен элемент управления «select2», и когда я нажму на элемент управления select2, будет отображен select3, как это.Я сделал свое приложение на NetBeans 7.0.1 и использую фреймворк jsf 2.0 и richFaces 4.2.0.

Мое решение состоит в том, чтобы создать два a4j: ajax с идентификаторами ajax1 и ajax2, чтобы назначить рендеринг для select2 и select3 на основе событий select1 и select2 selectItem.Я расположил ajax1 и ajax2 в очереди с идентификатором queue1.

Вот код страницы:

<h:form>
    <a4j:queue name="queue1"  onerror="window.alert('alert in queue');" onrequestdequeue="window.alert('queue1 dequeue');" onrequestqueue="window.alert('queue1 enqueue');" requestDelay="1000" ignoreDupResponses="true"/>
     <h3 style="text-align: center">Test case 1: 3 selection controls problem</h3>

     <br/><br/>
    <h:outputLink value="../index.xhtml">View Index </h:outputLink>
    <br/><br/>
     Problem: <h:outputText escape="false" value="#{carBean.testDescription}"/>
    <br/><br/>
    <table>
        <tr>
            <td>Car Firm (selection1)</td>
            <td>Car type (selection2)</td>
            <td>Production (selection3)</td>
        </tr>
        <tr>
            <td>
        <rich:select id="select1" value="#{carBean.companyName}" maxListHeight="100"  enableManualInput="true"  defaultLabel="Type here">      
            <a4j:ajax id="ajax1" queueId="queue1" execute="@form" render="select2, errorText" event="selectitem"  listener="#{carBean.changeCompanyEvent()}">

            </a4j:ajax>                                
            <f:selectItems value="#{carBean.lstCompany}"></f:selectItems>
        </rich:select>
        </td>
        <td>
        <rich:select id="select2" value="#{carBean.typeName}"  maxListHeight="100"  enableManualInput="true" defaultLabel="Type here"  >      
            <a4j:ajax id="ajax2" queueId="queue1"  immediate="true"  execute="@form" render="select3, errorText" event="selectitem"  listener="#{carBean.changeCarTypeEvent()}">

            </a4j:ajax>                                
            <f:selectItems value="#{carBean.lstCarType}"></f:selectItems>
        </rich:select>
        </td>
        <td>
        <rich:select id="select3" value="#{carBean.productionName}" 
                     maxListHeight="100"  enableManualInput="true" defaultLabel="Type here"  >                                              
            <f:selectItems  value="#{carBean.lstCarProduction}"></f:selectItems>
        </rich:select>
        </td>
        </tr>
    </table>
    <br/><br/>
    <h:outputText id="errorText" escape="false" value="#{carBean.alertError}"/>

</h:form>

Возникли проблемы: у меня 2 проблемычто я до сих пор не нашел причины:

  • select2 должен установить немедленный = true, иначе событие, определенное в ajax2, не будет выполнено.

Я не знаючто вызвало это.

  • Когда я установил немедленный = true для select2, было вызвано событие ajax2.Но переменная typeName, которая назначена в качестве значения элемента управления select2, все еще не имеет присвоенного значения, поэтому select3 еще не присвоено значение.

Вот изображения ошибок: http://i970.photobucket.com/albums/ae190/swenteiger7/richFaces%20error-%20110312/testcase1Error.png

Приложение : Я также отправил свой проект приложения (открытый с помощью IDE Net Beans), чтобы ответить на этот вопрос.Вы можете сконцентрироваться на 3 элементах: - файлface-config.xml в папке Web / Web-INF, в котором определен управляемый компонент CarBean; - папка testcase1 в веб-папке (в которой есть threeSelectExample.xhtml).- Пакет bean и пакет утилит для сохранения управляемого компонента (в testcase1 мы применяем его в управляемом компоненте CarBean).

Вы можете скачать мой архивный проект в моем прикрепленном файле.Пожалуйста, добавьте JSF2.0 и среду richFaces для запуска приложения (https://community.jboss.org/wiki/HowToAddRichFaces4xToProjectsNotBasedOnMaven)

Вот мое приложение: http://www.mediafire.com/?fnab3824b8vwd93

Если у вас возникли проблемы с загрузкой, свяжитесь со мной. Спасибо.

1 Ответ

0 голосов
/ 12 марта 2012

У меня была похожая проблема с rich:select. Чтобы решить эту проблему, нам пришлось изменить значение на h:selectOneMenu и добавить возможность ajax для функции JavaScript onchange. Кроме того, когда вы используете подход ajax, вы должны использовать valueChangeListener в вашем h:selectOneMenu для установки выбранного значения вместо атрибута value.

Я дам вам образец

<h:selectOneMenu id="select1" maxListHeight="100" 
    enableManualInput="true" defaultLabel="Type here"
    valueChangeListener="#{carBean.changeCompanyName}">
    <f:selectItems value="#{carBean.lstCompany}"></f:selectItems>
    <a4j:ajax id="ajax1" queueId="queue1" execute="@form"
        render="select2, errorText" event="selectitem"
        listener="#{carBean.changeCompanyEvent()}">
</h:selectOneMenu>

В вашем ManagedBean у вас должен быть такой код:

@ManagedBean(name="carBean")
@ViewScoped
public class CarBean implements Serializable {
    private String companyName;
    //getters and setter...
    //constructor and other functions
    public void valueChangeMethod(ValueChangeEvent e){
        companyName = (String)e.getNewValue();
    }
}

На форуме RichFaces есть сообщение об этой проблеме . Кроме того, запись в блоге BalusC (эксперт JSF) о заполнении дочернего меню .

...