2010-08-05 2 views
0

결과가 SlickGrid로 렌더링되는 검색 페이지가 있습니다. onkeyup을 실행하는 아약스 검색이므로 검색을 수행하고 Slick.Grid 인스턴스의 render을 호출 할 수 있으며 첫 번째 비동기 render이 완료되기 전에 다른 결과가 다시 나타납니다. 두 번째 ajax 요청이 돌아 오면 동시에 render 두 개의 호출이 동시에 발생하지 않도록 초기 render을 취소하고 싶습니다. 예 함께SlickGrid 비동기 렌더링을 중단하는 방법이 있습니까?

편집 : 여기

내가 실행 순서를 추적 할 수있는 장소에 alert들과 함께, 뭘하는지입니다.

1 
1 
2 
+0

당신은 그 행동을 어떻게 일으키는 지 자세히 설명해 줄 수 있습니까? 1) 브라우저 JS 실행은 단일 스레드이므로 문자 그대로 동시에 실제로는 아무 것도 수행 할 수 없습니다. 2) grid.render()에 대한 API 수준의 호출은 키보드 키를 놓는 동안 스크롤 위치가 변경되지 않았기 때문에 거의 모든 상황에서 renderRows()에 대한 동기 호출을 발생시킵니다. – Tin

답변

1

뭔가 다른 페이지에 계속이 있어야한다 : 나는 빠르게 연속으로 userInputField 텍스트 필드에 두 개의 숫자를 입력 할 때

function setupGrid() { 
    slickDataView = new Slick.Data.DataView(); 
    slickGrid = new Slick.Grid(slickGridDiv, slickDataView.rows, slickGridColumns, slickGridOptions); 
    slickDataView.onRowsChanged.subscribe(function(rows) { 
     slickGrid.removeRows(rows); 
     slickGrid.updateRowCount(); 
     slickGrid.render(); 
    }); 
    slickDataView.onRowCountChanged.subscribe(function(args) { 
     slickGrid.updateRowCount(); 
     slickGrid.render(); 
    }); 
} 

function performSearch() { 
    jQuery.get('searchPage.php', {MODEL_ID: userInputField.val()}, 
     function(results) { 
     slickDataView.beginUpdate(); 
     alert(1); 
     slickDataView.setItems(results); 
     alert(2); 
     slickDataView.endUpdate(); 
     } 
    ); 
} 

setupGrid(); 
userInputField.keyup(function() { performSearch(); }); 

나는이 시퀀스에서 다음과 같은 경고를 얻을. 나열된 예제는 불가능합니다 - 이벤트가 시작되면 JavaScript 실행이 중단되지 않습니다. 이벤트는 현재 코드가 실행 완료된 후 이벤트 루프에 의해 큐에 저장되고 선택됩니다. 귀하의 예에서 볼 수있는 것은 1212입니다.

AJAX 응답이 다시 돌아오고 이전 검색 결과가 무시 될 수 있기 때문에 AJAX 호출을 차단하고 이전 호출에서 콜백을 취소해야합니다 새로운 것들.

+0

작은 수정 : .setItems()에 대한 호출이 첫 번째 Ajax 호출에서 예외를 throw하는 경우에만 가능합니다. 파이어 폭스는 불평하지 않습니다 – Tin

+0

반면, IE8은 다음과 같은 예외를 DataView를의 refreshIdxById 방법을주고있다 : 메시지 : 65 문자 : 'items.length은'null이거나 개체가 아닙니다 라인 (28) 코드 : 0 URI : http : //localhost/javascript/slickgrid/slick.model.js –

+0

@Tin : XMLHttpRequest를 캐싱하고 진행중인 경우 새 검색을 실행하기 전에 중단합니다.하지만 이중 렌더링을 방지하지는 못했습니다. . 내 코드에 다른 문제가 있는지 좀 더 살펴보고있다. –