Подсветка полей JSF постами Ajax? - PullRequest
1 голос
/ 04 сентября 2011

Я строю на решении BalusC для выделения и фокусировки полей в JSF.Мой план - вывести массив JSON с идентификаторами, а затем вызвать метод, который будет обрабатывать этот массив.Это прекрасно работает, когда я не использую

Вот мое решение для прослушивания фазы:

public void beforePhase(PhaseEvent event) {
    FacesContext facesContext = event.getFacesContext();
    List<String> highlightFields = new ArrayList<String>();

    Iterator<String> highlightFieldsItr = facesContext
            .getClientIdsWithMessages();
    while (highlightFieldsItr.hasNext()) {
        StringBuilder sb = new StringBuilder();
        sb.append("#");
        sb.append(highlightFieldsItr.next().replaceAll(":", "\\\\:"));
        highlightFields.add(sb.toString());
    }
    JSONArray jsonHighlightFields = new JSONArray(highlightFields);

    facesContext.getExternalContext().getRequestMap()
            .put("errorFields", jsonHighlightFields.toString());
}

В основном это приведет к значению errorFields с чем-то вроде ["#some \: id1", "#some \ id2"].Затем я могу сделать что-то подобное в моем корневом файле макета:

   <script>
     var errorFields = ${errorFields}; // This will xlate to ["#some\\:id1", "#some\\:id2"

     $(document).ready(function(){
         processInputErrors(errorFields);
     });
   </script>

С помощью функции processInputErrors:

function processInputErrors(ids) {
    for (id in ids) {
        if (focus == false) {
            jQuery(ids[id]).focus();
            focus = true;
        }
        jQuery(ids[id]).addClass('input-error');
    }
}

Однако мне нужно каким-то образом получить этот список в функциикоторый вызывается при успешном завершении сообщения ajax.

Теперь f: ajax имеет атрибут onevent, и эта функция вызывается, но я не уверен, что именно он передается.Как бы я мог как-то передать недействительные идентификаторы от слушателя фазы этой функции?Кажется, передан объект, который представляет HTMLInputElement?

  <f:ajax event="change" onevent="test" render="test test_msg" immediate="true" />

Рад слышать об альтернативных предложениях или идеях.Цель состоит в том, чтобы сфокусировать и выделить поля, которые являются недопустимыми не только для полного постбека, но и при использовании f: ajax.

Спасибо!

1 Ответ

3 голосов
/ 04 сентября 2011

Эта статья была больше ориентирована на JSF 1.x. JSF 2.x предлагает теперь множество преимуществ, из которых следующие являются полезными для вашего конкретного требования:

  • Вы можете ссылаться на текущий компонент в EL по #{component}. В случае входных компонентов это UIInput, который, в свою очередь, имеет метод isValid(). Это можно использовать в атрибуте styleClass.
  • Вы можете использовать <f:ajax> для повторного рендеринга частей вида, а также <script> элементов.

1 + 1 - это ...

<h:inputText id="input1" value="#{bean.input1}" required="true" styleClass="#{component.valid ? '' : 'error'}">
    <f:ajax render="@this input1message focus" />
</h:inputText> 
<h:message id="input1message" for="input1" />
...
<h:inputText id="input2" value="#{bean.input2}" required="true" styleClass="#{component.valid ? '' : 'error'}">
    <f:ajax render="@this input2message focus" />
</h:inputText> 
<h:message id="input2message" for="input2" />
...
<h:panelGroup id="focus"><script>jQuery(":input.error:first").focus();</script></h:panelGroup>

Больше не нужно PhaseListener. При необходимости вы можете обернуть шаблон входной разметки в составной компонент или файл тегов .


Возвращаясь к вашему конкретному вопросу об атрибуте onevent, проверьте этот ответ: JSF 2: Как показать разные состояния AJAX на одном входе?

...