当以编程方式创建时,Primefaces数据表sortField为null,过滤器映射{}



当惰性数据表以编程方式(使用binding和valExp)创建时,sortField始终为null,排序顺序升序,过滤map{}。这是在单击排序字段或在筛选字段中键入字符串时发生的。

在没有绑定的情况下,在xhtml视图中,一切都像宣传的那样工作。我也看了PhaseListener加载序列,并没有发现在这两种情况下有什么不同,只是在第一它不工作。

TestController是@ viewscope。试用了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

'绑定'元素和'@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>

相关内容

  • 没有找到相关文章

最新更新