Проблемы SelectInputText ValueChangeListener в IceFaces 1.8

Я использую ICEFaces 1.8 для своего приложения. У меня есть несколько SelectInputText в такой сетке:

<ice:panelGrid columns="4">             
            <ice:selectInputText id="txtId"                             
                         valueChangeListener="#{employeeBean.searchIdListener}" partialSubmit="true"></ice:selectInputText>
            <ice:selectInputText id="txtFirstName"
                         valueChangeListener="#{employeeBean.searchFirstNameListener}" partialSubmit="true"></ice:selectInputText>
            <ice:selectInputText id="txtLastName"
                         valueChangeListener="#{employeeBean.searchLastNameListener}" partialSubmit="true"></ice:selectInputText>
            <ice:selectInputText id="txtPhoneNumber"
                         valueChangeListener="#{employeeBean.searchPhnNbrListener}" partialSubmit="true"></ice:selectInputText>
        </ice:panelGrid>

Когда я изменяю значение любого из вышеперечисленных SelectInputText, я вижу, что все четыре вышеуказанных метода ValueChangeListener выполняются. ПОЧЕМУ?

Разве не должен выполняться только метод, SelectInputText которого имеет некоторые изменения значения?

Пожалуйста, дайте мне знать об этом.


person user182944    schedule 23.04.2013    source источник


Ответы (2)


Я думаю, что это связано с непониманием того, для чего предназначен атрибут partialSubmit, а также с непониманием атрибута valueChangeListener.

Допустим, при отправке формы нажатием кнопки отправки все компоненты в форме, привязанные к значению управляемого свойства или назначенные методу управляемого компонента в valueChangeListener, имеют свои значения запросов, которые отправляются, обрабатываются и проверяются сервером. Предполагая, что этап проверки прошел успешно, эти отправленные значения передаются на этап UPDATE_MODEL, где будет вызываться каждый метод valueChangeListener.

По сути, этот метод НЕ рассматривается как событие приложения, такое как событие Click или Change.

Однако, используя отправку Ajax, мы можем контролировать, какие компоненты в форме JSF будут отправлены, а какие элементы управления будут повторно отображены для отображения их новых значений после того, как ответ будет получен клиентом. Однако атрибут partialSubmit просто работает в сочетании с запросом Ajax, чтобы минимизировать размер ViewState и запроса по соображениям производительности. Функционально этот атрибут partialSubmit сам по себе не имеет никакого реального эффекта.

person maple_shaft    schedule 23.04.2013
comment
Спасибо за ответ. Выложенная выше панельная сетка присутствует в форме. Когда страница загружается в первый раз, вызываются все четыре прослушивателя изменения значения. Но во второй раз вызывается только ValueChangeListener, специфичный для одного компонента. Какие-то конкретные причины для этого? Почему не во второй раз тоже все методы вызываются? - person user182944; 23.04.2013
comment
Кроме того, для selectInputText, если я удаляю partialSubmit, тогда также срабатывает метод слушателя ValueChange... почему? - person user182944; 23.04.2013
comment
@user182944 user182944 В вашем вопросе говорится, что все valueChangeListeners вызываются, и это плохо, теперь вы говорите, что вызывается только один, когда вы хотите, чтобы все они вызывались. В чем тогда ваша проблема, потому что вы делаете ужасную работу по объяснению своего непонимания. Я не могу больше рассказать о вашей ситуации, если вы не отредактируете свой вопрос, чтобы предоставить весь свой код. - person maple_shaft; 23.04.2013
comment
Только мое плохое :( Код содержит только форму и 4 selectInputText, где для valueChangeListener и частичного представления установлено значение true. Все методы слушателя вызываются в первый раз. В следующий раз вызываются только определенные. Это что я пытался сказать.Знаете ли вы, почему он так себя ведет?В любом случае, ваш ответ был очень полезен для моей концепции. - person user182944; 23.04.2013

Вероятно, это происходит из-за того, что <ice:selectInputText> исходные значения равны NULL, а первая частичная или полная отправка приведет к отправке ПУСТОЙ строки со страницы.

Инициализируйте свой selectInputText пустыми строками, чтобы избежать этого, или вы можете добавить ниже в JSF 2.x,

<context-param>
    <param-name>
         javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL
    </param-name>
    <param-value>true</param-value>
</context-param>

Кроме того, чтобы добавить к Icefaces, его частичное представление немного сбивает с толку. Это больше похоже на полную отправку Ajax с частичным рендерингом Ajax/DOM. Есть несколько случаев, когда icefaces 1.8 будет выполнять несколько компонентов на странице, однако избегает этого в столбцах с данными, в панелях и т. д.

person Avinash Singh    schedule 24.04.2013