a4j: param не вызывает мой javascript, на который указывает атрибут value - PullRequest
0 голосов
/ 27 января 2012

Я открыт для другого способа сделать это, но то, что у меня есть, похоже, должно работать из документации для 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: link

и

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

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

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

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

1 Ответ

0 голосов
/ 27 января 2012

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

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

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

...