2011-09-03 145 views
1

我建立在BalusC's solution上,突出显示并集中了JSF中的字段。我的计划是用ID输出一个JSON数组,然后调用一个方法来处理这个数组。当我不使用< F该工作正常:AJAX/>JSF字段突出显示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时无效的字段。

谢谢!

回答

3

该文章更多地针对JSF 1.x. JSF 2.x现在提供了很多优点,其中以下是有利于您的特定要求:

  • 您可以通过#{component}引用EL中的当前组件。在输入组件的情况下,这是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了。如有必要,您可以将输入标记样板包装在composite componenttag file中。


回到关于onevent属性您具体问题,检查这个答案:JSF 2: How show different ajax status in same input?

+0

我看到从阿贾克斯后的XML响应具有将刚刚执行的标签。我将如何能够在回应中插入一些JavaScript?似乎规范支持它,但不知道我会如何实现它。 –

+0

当使用复合组件时,如果'panelGroup'存在于组件的cc:implementation'之外,那么就无法找到'focus' id属性。如果有办法让复合组件引用id属性,那么支持这个答案的例子将是最有帮助的。 –