2013-10-07 2 views
1

DB의 연락처 정보를 표시하는 셀 테이블을 만들려고합니다. 표시하려는 테이블에 많은 행이 있습니다.gwt cellTable 클라이언트 측 캐싱

현재 데이터를 쉽게 표시 할 수있었습니다. 나의 단 하나의 문제는 내가 호출기에서 페이지를 변경할 때입니다. gwt는 이전에이 페이지를 요청했지만 데이터를 계속 요청합니다.

어떻게하면 클라이언트 쪽 캐싱을 할 수 있습니까? 여기

PS는 onRangeChanged의 코드 조각입니다 :

AsyncDataProvider<Contact> provider = new AsyncDataProvider<Contact>() { 
    @Override 
    protected void onRangeChanged(HasData<Contact> display) { 
    int start = display.getVisibleRange().getStart(); 
    int end = start + display.getVisibleRange().getLength(); 
    end = end >= DBHelper.size() ? DBHelper.size() : end; 
    List<Contact> sub = DBHelper.get(start, end); 
    updateRowData(start, sub);   
    } 
}; 

편집 : 추로 난 결과와 먹으 렴의 일부를 캐시 것 (DBHelper 같은) 헬퍼 클래스를 만들 것을 제안

어떻게 DB 액세스를 건너 뛸 것인가? 그게 아니라 내가 의도 한대로, 나는 클라이언트 쪽에서 캐시를 가지고 indented, 도우미 클래스는 여전히 내게 클라이언트 -> 서버 호출을 구하지 않을거야.

답변

2

클라이언트에서 캐싱을 돕기 위해 클래스를 구현해야합니다. 서비스 인터페이스 (DBHelper)와 CellTable 사이의 계층으로 작동합니다. RPC 요청을 관리하고 데이터를 새로 고쳐야 할 때만 RPC 호출을 수행합니다. 그렇지 않으면 Map과 같은 일부 캐시 구조에서 캐시 된 데이터가 반환됩니다.

구현 한 후 AsyncDataProviderDBHelper.get(start, end) 대신 CacheImpl.get(start, end);을 호출합니다.

+0

내 원본 게시물에서 내 편집을 참조하십시오. – Urbanleg

+0

@Urbanleg 일단 데이터를 가져온 다음 검색된 데이터를 통해 페이지를 가져 오려면 'AsyncDataProvider' 대신'ListDataProvider' 클래스를 사용해야합니다. 여전히 RPC 호출을 한 다음 결과를'ListDataProvider'에 전송할 수 있습니다. ListDataProvider는 호출 및 분류를 동 기적으로 처리합니다. – Churro

1

또한 메모리 사용을 돕기 위해 EntityWindow를 사용합니다. 이는 두 범위를 이전에 유지하고 두 범위를 먼저 가져 오는 것입니다. 이렇게하면 다음 페이지를 더 빨리 만들기 위해 메모리에 캐시 된 객체의 양을 제한하고 백그라운드에서 다음 두 개를 가져올 수 있습니다. 로드 할 때 뷰를 렌더링하는 데 필요한 데이터를 가져 와서 백그라운드에서 이동하여 다음 버튼이 즉시로드되도록 2x 또는 3x display.getVisibleRange(). getLength() 엔티티를 가져올 수 있습니다. 사용자가 다음을 클릭하면 미래 요소를 가져오고 이전 요소를 삭제할 수 있습니다.