2014-01-17 43 views
2

在JSF & Primefaces web應用程序中,我想爲primefaces輸入文本區域控件的完整方法傳遞一個值。我已經嘗試過如下。傳遞參數來完成primefaces inputtextarea控件的方法

JSF文件

<p:inputTextarea id="txtMicMemoVal" 
      value="#{patientReportController.memoEnterVal}" 
      style="min-width: 200px;" 
      completeMethod="#{investigationItemValueController.completeValues}" > 
     <f:attribute name="ii" value="#{pv.investigationItem}" /> 
     <f:ajax event="blur" execute="@this" 
       listener="#{patientReportController.saveMemoVal(pv.id)}" ></f:ajax> 
</p:inputTextarea> 

相關支持bean

public List<String> completeValues(String qry) { 
    System.out.println("completing values"); 
    FacesContext context = FacesContext.getCurrentInstance(); 
    InvestigationItem ii; 
    try { 
     ii = (InvestigationItem) UIComponent.getCurrentComponent(context).getAttributes().get("ii"); 
     System.out.println("ii = " + ii); 
    } catch (Exception e) { 
     ii = null; 
     System.out.println("error " + e.getMessage()); 
    } 
    Map m = new HashMap(); 
    String sql; 
    sql = "select v.name from InvestigationItemValue v " 
      + "where v.investigationItem=:ii and v.retired=false and" 
      + " (upper(v.code) like :s or upper(v.name) like :s) order by v.name"; 
    m.put("s","'%"+ qry.toUpperCase()+"%'"); 
    m.put("ii", ii); 
    List<String> sls = getFacade().findString(sql, m); 
    System.out.println("sls = " + sls); 
    return sls; 
} 

但是,當我輸入文本輸入文本區域不開的支持bean方法。但是,如果我刪除f:屬性,則會觸發輔助bean。但我也想要這個參數以及功能。

在此先感謝引導我過來這個問題。

回答

1

有趣的問題。 Primefaces將限制您在完成方法中僅接收String參數,因此我看到的唯一解決方案是在完成函數被調用時在服務器端計算表達式。

我想你有一個迭代(ui:repeatp:dataTable),其中每個id不同於前一個。如果你不這樣做,你也可以使用它。

這將是要走的路:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head /> 
<h:body> 
    <h:form> 
     <ui:repeat var="str" value="#{bean.strings}"> 
      <p:inputTextarea value="#{bean.value}" style="min-width: 200px;" 
       completeMethod="#{bean.complete}" /> 
     </ui:repeat> 
    </h:form> 
</h:body> 
</html> 
@ManagedBean 
@RequestScoped 
public class Bean { 
    public String value; 

    public List<String> strings = Arrays.asList("param1", "param2", "param3"); 

    public List<String> complete(String query) { 
     List<String> results = new ArrayList<String>(); 
     //Here we evaluate the current #{str} value and print it out 
     System.out.println(FacesContext 
       .getCurrentInstance() 
       .getApplication() 
       .evaluateExpressionGet(FacesContext.getCurrentInstance(), 
         "#{str}", String.class)); 
     if (query.equals("PrimeFaces")) { 
      results.add("PrimeFaces Rocks!!!"); 
      results.add("PrimeFaces has 100+ components."); 
      results.add("PrimeFaces is lightweight."); 
      results.add("PrimeFaces is easy to use."); 
      results.add("PrimeFaces is developed with passion!"); 
     } 
     return results; 
    } 

    public List<String> getStrings() { 
     return strings; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

} 

注意你正在評估當前的EL結果爲#{str}當方法調用執行。根據您寫入的p:inputTextArea,您會得到不同的評估結果。

參見:

+0

感謝。那很有效。我很想發佈我的代碼,但在評論中,這是不可能的。 –

+0

你仍然可以編輯上面的問題並添加它;) –