JSF字段用ajax帖子突出显示?

时间:2011-09-03 22:31:17

标签: jsf-2 ajax4jsf

我正在构建BalusC's solution以突出显示并聚焦JSF中的字段。我的计划是输出一个带有id的JSON数组,然后调用一个方法来处理这个数组。当我不使用< f:ajax />

时,这可以正常工作

这是我的阶段监听器解决方案:

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属性并且这个函数确实被调用了,但是我不确定它传递的是什么。我怎么能以某种方式将无效的ID从相位监听器传递给这个函数?它似乎传递了一个代表HTMLInputElement的对象?

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

很高兴听到其他建议或想法。目标基本上是集中并突出显示不仅在完整的回发后以及使用f:ajax时无效的字段。

谢谢!

1 个答案:

答案 0 :(得分:3)

那篇文章更针对JSF 1.x. JSF 2.x现在提供了许多优点,其中以下内容有益于您的特定要求:

  • 您可以通过#{component}引用EL中的当前组件。在输入组件的情况下,这是UIInput,而composite component又具有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了。如有必要,您可以将输入标记样板包装在tag fileJSF 2: How show different ajax status in same input?中。


返回有关onevent属性的具体问题,请查看以下答案:{{3}}