4

レイジーデータテーブルがプログラムで(バインディングとvalExpを使用して)作成される場合、sortFieldは常にnull、sortorder Ascending、フィルターはマップ{}です。これは、ソートフィールドをクリックするか、フィルターフィールドに文字列を入力することです。

バインディングなしで同じことが行われると、すべて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 -> {}

2番目のデータテーブルは、同じものがバインディングで使用されていない場合、それが機能することの証明です

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
4

1 に答える 1

1

「 binding」要素と「@ViewScoped」スコープの間に問題があります。ここで詳細情報を読むことができます: http://balusc.blogspot.com/2010/06/benefits-and-pitfalls-of-viewscoped.html#HeyTheresPitfallsInTheTitle

バインディングと現在のスコープを維持したい場合の 1 つの解決策は、コンポーネントの完全な状態の保存を有効にすることです。これを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>
于 2013-03-21T10:37:37.707 に答える