2011-09-03 146 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屬性,那麼支持這個答案的例子將是最有幫助的。 –