Сообщение значения с использованием h: inputtext и a4j: support onkeyup

Первоначально я публиковал значение в поле h: inputText с помощью a4j: commandButton, но мне пришлось изменить commandButton на s: link, потому что commandButton также запускает экспорт PDF-документа, и я считаю, что с вызовом ajax, вместо этого документ отображается в браузере.

Итак, теперь я пытаюсь опубликовать значение, используя h: inputText и a4j: support

<h:inputText id="numberOfPatients" 
    value="#{printLabelsReqFormsAction.numberOfPatients}">
    <a4j:support event="onkeyup" 
        action="#{printLabelsReqFormsAction.setNumberOfPatients(numberOfPatients)}"/>
</h:inputText>

(извините за странное форматирование..)

Мой setNumberOfPatients(x) вызывается, но я не думаю, что правильно передаю значение. Как мне передать значение поля h: inputText?


person jackie    schedule 22.10.2013    source источник


Ответы (1)


Вам не нужно явно устанавливать значение numberOfPatients при выполнении поддержки ajax. Тег a4j:support обрабатывает свой родительский компонент во время своего выполнения, что означает, что значение для numberOfPatients будет установлено для каждого события onkeyup, даже если вы не вызываете событие action. Вы можете увидеть это лучше на сайте Richfaces :

RichFaces использует подход на основе форм для отправки запросов Ajax. Это означает, что каждый раз, когда вы нажимаете кнопку Ajax или создаете асинхронный запрос, данные из ближайшей формы JSF отправляются с объектом XMLHTTPRequest. Данные формы содержат значения из элемента ввода формы и вспомогательную информацию, такую ​​как данные сохранения состояния.

Когда значение атрибута "ajaxSingle" равно "true", он приказывает включить в карту запроса только значение текущего компонента (вместе со значениями или <a4j:actionparam>, если таковые имеются). В случае <a4j:support> это значение родительского компонента. Пример размещен ниже:

<h:form>
    <h:inputText value="#{person.name}">
        <a4j:support event="onkeyup" reRender="test" ajaxSingle="true"/>
    </h:inputText>
    <h:inputText value="#{person.middleName}"/>
</form>

Другими словами, для вашего случая это должно работать:

<h:inputText id="numberOfPatients" 
    value="#{printLabelsReqFormsAction.numberOfPatients}">
    <a4j:support event="onkeyup" ajaxSingle="true"/>
</h:inputText>

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

person Xtreme Biker    schedule 22.10.2013
comment
Итак, я отлаживаю этот предложенный код и вижу, что для numberOfPatients устанавливается мое значение ввода в текстовом поле. Но когда я нажимаю кнопку s:link, которую я создал ниже, метод set вызывается снова и сбрасывается на 0. Похоже, то, что вы предложили, правильно, но мне, вероятно, нужно сделать что-то еще с этой ссылкой - person jackie; 22.10.2013
comment
Это ожидаемое поведение для request scoped управляемого компонента. Учтите, что вы генерируете другой запрос, когда делаете вызов ajax, а bean-компонент настроен на работу только для запроса. Какую версию JSF вы используете? В JSF 2 вы можете использовать view scope, чтобы продлить жизнь bean-компонента, но JSF 1.x заставит вас каким-то образом сохранить установленное вами значение, используя, например, атрибут сеанса, поскольку view scope там не реализовано. Другим вариантом было бы сделать весь bean-компонент session scoped. - person Xtreme Biker; 22.10.2013
comment
Я использую JSF 1.1, поэтому я думаю, что все стало немного сложнее. Я постараюсь сохранить ценность, но, похоже, я на правильном пути! Спасибо за подробное объяснение всего, я все это изучаю на ходу - person jackie; 22.10.2013
comment
Еще раз спасибо, я сделал свой сеанс bean-компонента ограниченным, и все работает очень хорошо. - person jackie; 22.10.2013
comment
@jackie, пожалуйста, не используйте область сеанса для своего bean-компонента, вместо этого измените ее на область запроса и используйте аннотацию @KeepAlive в своем bean-компоненте, чтобы ваш bean-компонент с областью запроса оставался активным, пока пользователь все еще находится в том же представлении. - person Luiggi Mendoza; 22.10.2013
comment
Хорошо, я попробую это сейчас - person jackie; 22.10.2013