2013-03-04 83 views
4

以編程方式創建lazy datatable(使用binding和valExp)sortField始終爲null,sortorder升序,過濾器映射{}。這是在單擊一個分類字段或在過濾字段中輸入一個字符串。Primefaces Datatable sortField null和過濾器map {}以編程方式創建

當同樣的做法沒有綁定,所有在xhtml視圖中,一切都按照廣告的方式工作。我也查看了PhaseListener的加載順序,在兩種情況下都沒有發現任何不同,只是在第一次不起作用。

TestController是@ViewScoped。試用PF版本3.5,3.4.2,3.3.1,3.3。

我做錯了嗎?

視圖

<p:dataTable binding="#{testController.datatable}" /> 

    <p:dataTable value="#{testController.testModel}" var="val" rows="5" lazy="true"> 
    <p:column sortBy="#{val}"> 
     #{val} 
    </p:column> 
    </p:dataTable> 

datatable = new DataTable(); 
    datatable.setValueExpression("lazy",createValueExpression("true", Boolean.class)); 
    datatable.setValueExpression("rows",createValueExpression("10", Integer.class)); 
    datatable.setValueExpression("value",createValueExpression("#{testController.testModel}", DataModel.class)); 
    datatable.setVar("val"); 


    Column column = new Column(); 
    column.setValueExpression("sortBy", createValueExpression("#{val}", String.class)); 

    HtmlOutputText output = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE); 
    output.setValueExpression("value", createValueExpression("#{val}", String.class)); 

    column.getChildren().add(output); 

    datatable.getChildren().add(column); 

模型

public List<String> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) { 
    List<String> modelMock = new ArrayList<String>() { 
     { 
      add("abc"); 
      add("def"); 
     } 
    }; 
    if (LOGGER.isDebugEnabled()) { 
     LOGGER.debug("load()"); 
    } 

    if (LOGGER.isDebugEnabled()) { 
     LOGGER.debug("first " + first + " pageSize" + pageSize); 

     LOGGER.debug("sortField -> " + sortField); 
     LOGGER.debug("sortOrder -> " + sortOrder); 
     LOGGER.debug("filters -> " + filters); 
    } 

    this.setRowCount(modelMock.size()); 

    return modelMock; 
} 

調試輸出

11:12:24,426 DEBUG TestModel:33 - load() 
11:12:24,426 DEBUG TestModel:37 - first 0 pageSize10 
11:12:24,426 DEBUG TestModel:39 - sortField -> null 
11:12:24,426 DEBUG TestModel:40 - sortOrder -> ASCENDING 
11:12:24,426 DEBUG TestModel:41 - filters -> {} 

的第二數據表,這證明了當相同的不與結合使用時,它的工作原理

11:21:25,677 DEBUG TestModel:33 - load() 
11:21:25,677 DEBUG TestModel:37 - first 0 pageSize5 
11:21:25,677 DEBUG TestModel:39 - sortField -> val 
11:21:25,677 DEBUG TestModel:40 - sortOrder -> DESCENDING 

回答

1

有「結合」元素和之間的問題「@ViewScoped」範圍。 您可以在這裏閱讀更多信息:http://balusc.blogspot.com/2010/06/benefits-and-pitfalls-of-viewscoped.html#HeyTheresPitfallsInTheTitle

一個解決方案,如果你想保持你的綁定,你的當前範圍是啓用組件的完整狀態保存。您可以通過添加以下內容到的web.xml

<context-param> 
    <!-- For Bug Fixing Viewscope beans with binding component attributes --> 
    <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name> 
    <param-value>/faces/myPageWithBindings.xhtml</param-value> 
</context-param> 
+0

什麼是使用javax.faces.FULL_STATE_SAVING_VIEW_IDS的缺點,將其設置爲指定的頁面?高架? – apod 2013-03-25 11:43:06

+0

例如,它可以通過增加內存使用量來影響性能。你可以在這裏閱讀信息:http://stackoverflow.com/questions/10337015/should-partial-state-saving-be-set-to-false – 2013-03-26 14:17:51