- When the table asks for data, the AsyncDataProvider uses the search criteria it last received
- When search criteria change, the AsyncDataProvider is updated and then a refresh is triggered to update the view with the new data (possibly by triggering the AsyncDataProvider)
BTW I'd do the same for the ColumnSortList: listen to the event and update the provider with the ColumnSortList before you trigger an update.
On Friday, July 19, 2013 10:46:58 AM UTC+2, Jochen Schnaidt wrote:
Hi everybody,I have a short but painful question: Where is the right place to initialize my AsyncDataProvider?Story so far:In my Controller class I have my AsyncDataProvider as reference and the search method where I built the asynchronous callback and process my data, looks like this.private final ClientServiceAsync service = GWT.create(ClientService.class); private AsyncDataProvider<Model> provider; private List<Model> dataList = new ArrayList<Model>(); // other stuff here... void search(final TO_Search pSearchCriteria) { // Associate an async data provider to the table provider = new AsyncDataProvider<Model>() { @Override protected void onRangeChanged(HasData<Model> display) { final int start = display.getVisibleRange(). getStart(); int length = display.getVisibleRange(). getLength(); // Get the ColumnSortInfo from the table. final ColumnSortList sortList = view.cellTable. getColumnSortList(); final ColumnSortInfo sortInfo = sortList.get(0); final String dataStoreName = sortInfo.getColumn(). getDataStoreName(); final boolean isAscending = sortInfo.isAscending(); AsyncCallback<TO_Result> callback = new AsyncCallback<TO_Result>() { @Override public void onFailure(Throwable caught) { Window.alert(caught. getMessage()); } @Override public void onSuccess(TO_Result data) { if (!GWT.isProdMode()) { GWT.log(this.getClass() + ": Remote Procedure Call - Success"); GWT.log(this.getClass() + ": No. of results = " + data.getCount()); } if (data.getCount() != 0) { dataList.addAll(data. getResults()); updateRowData(start, data.getResults()); updateRowCount(data.getCount() , true); if (data.isGoToFirstPage()) { view.setPagerFirstPage(); } } else { dataList.clear(); updateRowData(start, dataList); updateRowCount(data.getCount() , true); view.simplePopup.setWidget(new HTML(CONSTANTS. noSearchResults())); } } }; service.search(searchCriteria, start, length, dataStoreName, isAscending, callback); } }; } // end search() This solution works very well, most of time. Sometimes it shows a very strange behavior and comes up with old search results. And it looks absolutely wrong for me that the AsyncDataProvider is always new created for every search.Until now I have no other idea, how I could do this, because in the end, I need to call my service, which is defined in the AsyncDataProvider.Is this the right design?Thanks a lot in advance.Best regardsJochen
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit+unsubscribe@googlegroups.com.
To post to this group, send email to google-web-toolkit@googlegroups.com.
Visit this group at http://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/groups/opt_out.
No comments:
Post a Comment