@@ -187,16 +187,22 @@ where
187187
188188 let first_selected_index = create_rw_signal ( None :: < usize > ) ;
189189
190- let ( do_reload, set_reload) = create_signal ( false ) ;
191- let clear = move || {
190+ let ( row_count, set_row_count) = create_signal ( None :: < usize > ) ;
191+
192+ let ( reload_count, set_reload_count) = create_signal ( 0_usize ) ;
193+ let clear = move |clear_row_count : bool | {
192194 selection. clear ( ) ;
193195 first_selected_index. set ( None ) ;
194196
195197 loaded_rows. update ( |loaded_rows| {
196198 loaded_rows. clear ( ) ;
197199 } ) ;
198200
199- set_reload. set ( true ) ;
201+ if clear_row_count {
202+ set_row_count. set ( None ) ;
203+ }
204+
205+ set_reload_count. set ( reload_count. get ( ) . overflowing_add ( 1 ) . 0 ) ;
200206 } ;
201207
202208 let on_head_click = {
@@ -207,14 +213,19 @@ where
207213
208214 rows. borrow_mut ( ) . set_sorting ( & sorting ( ) ) ;
209215
210- clear ( ) ;
216+ clear ( false ) ;
211217 }
212218 } ;
213219
214- create_effect ( move |_| {
215- // triggered when `ReloadController::reload()` is called
216- reload_controller. track ( ) ;
217- clear ( ) ;
220+ create_effect ( {
221+ let rows = Rc :: clone ( & rows) ;
222+
223+ move |_| {
224+ // triggered when `ReloadController::reload()` is called
225+ reload_controller. track ( ) ;
226+ rows. borrow ( ) . track ( ) ;
227+ clear ( true ) ;
228+ }
218229 } ) ;
219230
220231 let selected_indices = match selection {
@@ -238,8 +249,6 @@ where
238249 UseElementSizeOptions :: default ( ) . box_ ( web_sys:: ResizeObserverBoxOptions :: ContentBox ) ,
239250 ) ;
240251
241- let ( row_count, set_row_count) = create_signal ( None :: < usize > ) ;
242-
243252 let set_known_row_count = move |row_count : usize | {
244253 set_row_count. set ( Some ( row_count) ) ;
245254 loaded_rows. update ( |loaded_rows| loaded_rows. resize ( row_count) ) ;
@@ -335,15 +344,13 @@ where
335344 let first_visible_row_index = first_visible_row_index. get ( ) ;
336345 let visible_row_count = visible_row_count. get ( ) ;
337346
347+ // with this a reload triggers this effect
348+ reload_count. track ( ) ;
349+
338350 if visible_row_count == 0 {
339351 return ;
340352 }
341353
342- // with this a reload triggers this effect
343- if do_reload. get ( ) {
344- set_reload. set_untracked ( false ) ;
345- }
346-
347354 let mut start = first_visible_row_index. saturating_sub ( visible_row_count * 2 ) ;
348355
349356 let mut end = start + visible_row_count * 5 ;
@@ -411,12 +418,19 @@ where
411418 let set_known_row_count = set_known_row_count. clone ( ) ;
412419
413420 async move {
421+ let latest_reload_count = reload_count. get_untracked ( ) ;
422+
414423 let result = rows
415424 . borrow ( )
416425 . get_rows ( missing_range. clone ( ) )
417426 . await
418427 . map_err ( |err| format ! ( "{err:?}" ) ) ;
419428
429+ // make sure the loaded data is still valid
430+ if reload_count. get_untracked ( ) != latest_reload_count {
431+ return ;
432+ }
433+
420434 if let Ok ( ( _, loaded_range) ) = & result {
421435 if loaded_range. end < missing_range. end {
422436 if let Some ( row_count) = row_count. get_untracked ( ) {
0 commit comments