SmartGWT - переопределение tranformRequest и transformResponse - PullRequest
1 голос
/ 22 января 2012

Я пишу проект в GWT поверх GAE с помощью SmartGWT.

У меня есть БД с объектом, у каждого из которых есть объект "отец" и "сыновья", и я использую TreeGrid для их представления.У меня уже есть служба GWT-RPC, которая получает сыновей данного узла.

Теперь мне нужно как-то расширить класс DataSource st, когда узел дерева открыт, я смогу использовать свой собственный сервис для поиска и получения его сыновей, а затем вернуть их как то, что может сделать TreeGrid.работать с.

Я знаю, что должен переопределить transformRequest и transformResponse, но понятия не имею, как.Буду очень признателен за любой пример кода / объяснение!

Это то, что я имею до сих пор - не уверен, что это даже отдаленно правильно:

              budgetTree.setDataSource(new DataSource() {

            @Override
            protected Object transformRequest(final DSRequest dsRequest) {

              expensesService.getExpensesByYear(2008,
                  new AsyncCallback<ExpenseRecord[]>() {

                    @Override
                    public void onSuccess(ExpenseRecord[] result) {
                      System.out.println("Returned " + result.length + " expense record ");            
                      dsRequest.setAttribute("dsResult", result);
                    }

                    @Override
                    public void onFailure(Throwable caught) {
                      System.out.println("Failed to run query");
                    }

                  });

              return dsRequest;
            }

            @Override
            protected void transformResponse(DSResponse response, DSRequest request,
                Object data) {    
              Record[] recs = request.getAttributeAsRecordArray("dsResult");
              response.setData(recs);
              super.transformResponse(response, request, data);
            }


          });

1 Ответ

1 голос
/ 28 января 2012

Поскольку вы выполняете фактический запрос самостоятельно, вам сначала нужно посмотреть на setDataProtocol(DSProtocol.CLIENTCUSTOM);

Тогда и в onSuccess, и в onFailure вам нужно будет позвонить processResponse(), что вызовет transformResponse()

public class MyDatasource extends DataSource{
    public MyDatasource(){
        setDataProtocol(DSProtocol.CLIENTCUSTOM)           
    }

    @Override
    protected Object transformRequest(final DSRequest dsRequest) {

          expensesService.getExpensesByYear(2008,
              new AsyncCallback<ExpenseRecord[]>() {

                @Override
                public void onSuccess(ExpenseRecord[] result) {
                  DSResponse response = new DSResponse();
                  System.out.println("Returned " + result.length + " expense record ");            
                  dsRequest.setAttribute("dsResult", result);
                  Record[] recs = request.getAttributeAsRecordArray("dsResult");
                  response.setData(recs);
                  processResponse(dsRequest.getRequestId(), dsResponse);
                }

                @Override
                public void onFailure(Throwable caught) {
                  DSResponse response = new DSResponse();
                  System.out.println("Failed to run query");
                  processResponse(dsRequest.getRequestId(), dsResponse);
                }

              });

          return dsRequest;
   }

}

...