a4j:param не вызывает мой javascript, на который указывает атрибут value

Я открыт для другого способа сделать это, но то, что у меня есть, похоже, должно работать из документации для RichFaces4 и JSF2.

Пользовательский поток выглядит так:

  • 1) Существует ссылка на документ "Извлечь", реализованная с помощью h: outputLink
  • 2) Пользователь щелкает его и получает диалоговое окно для ввода комментариев к комментариям, реализованным с помощью rich:popupPanel
  • 3) Пользователь вводит комментарии и нажимает кнопку "Продолжить" на панели rich:popupPanel, реализованной с помощью h:link (пробовал также h:commandLink и a4j:commandLink)
  • 4) Появляется новое окно с содержимым, установленным для атрибута результата h: link

В моем случае все работает, кроме случаев, когда я передаю параметр из h: link с a4j:param, атрибут значения которого не разрешает JavaScript, на который он указывает правильно.

<h:outputLink id="promptForCommentsLink"
              onclick="#{rich:component('commentsDlg')}.show();return false;"
              value="#"> Check Out </h:outputLink>

<rich:popupPanel id="commentsDlg" modal="true">
    <h:inputTextarea id="commentsId"/>
    <h:link id="continueLink"
              outcome="editorPage" <!-- editor for making changes to document -->
              target="_blank" <!-- open in it;s own indow -->
              value="Continue Check Out"
              onclick="#{rich:component('commentsDlg')}.hide();">

        <!-- these params get assignd to backing bean properties -->
        <a4j:param name="dataId"
                   value="#{ithRow.id}" assignTo="#{myController.dataId}"/>
        <a4j:param name="checkedOut"
                   value="true" assignTo="#{myController.checkedOut}"/>

        <!-- this one is broken. assigns chars 'document.getElementById('.. 
             to #{myController.checkOutComment} -->
        <a4j:param name="checkOutComment"
                   assignTo="#{myController.checkOutComment}"
                   noEscape="true"
value="document.getElementById('myForm:dataTable:0:commentsId').value"
                   />
    </h:link>
</rich:popupPanel>

Я думал, может быть,

document.getElementById('myForm:dataTable:0:commentsId').value

Я не указывал на то, что я набрал в текстовой области, но, поместив еще одну кнопку на элементе dlg и указав его клик на тот же идентификатор элемента, он действительно предупредил меня о том, что он напечатал.

Когда я останавливаюсь на серверном представлении, ограниченном методом myController.setCheckOutComment(String s), ему передается строка "document.getElementById('myForm:dataTable:0:commentsId'). Value".

Согласно документации РФ4:

Тег a4j: param может использоваться с компонентами, отличными от Ajax, в дополнение к компонентам Ajax. Это включает в себя компоненты, которые работают через запрос GET, такие как ссылка h:

а также

Переменные из функций JavaScript могут использоваться для атрибута value. В такой реализации атрибут noEscape должен быть установлен в true. Используя noEscape="true", атрибут value может содержать любое выражение JavaScript или вызов функции JavaScript, и результат будет отправлен на сервер в качестве атрибута value.

Поскольку я, кажется, играю по правилам jsf/rf4, я подумал, что все будет в порядке.

Стоит заметить, что если я использую a4j:commandLink вместо h:link, он действительно отправляет результат оценки javascript, однако это ломает открытие в его собственном окне и некоторые другие проблемы.

Любые мысли о том, что может происходить, или даже лучший способ сделать это?

1 ответ

Вы можете использовать a4j:jsFunction с нужными вам параметрами. Затем вызовите эту функцию из клика по тегу h:link, например, setParams(#{ithRow.id}, true). Проблема остается в том, что вы не можете передать значение в качестве параметра функции javascript. Однако вы можете использовать 'execute', чтобы сохранить значение inputArea в бэк-компоненте и позволить бэкэнду обработать это значение.

Так что да, я бы сделал это по-другому. Я думаю, что вы могли бы обработать два других параметра в бэкэнде, и я бы использовал 'execute', чтобы сохранить значение inputArea.

МАГ, Мило ван дер Зее

Другие вопросы по тегам