Details
-
Type: Bug
-
Status: Closed
-
Priority: Major
-
Resolution: Fixed
-
Affects Version/s: 4.0
-
Fix Version/s: 4.1
-
Component/s: ACE-Components
-
Labels:None
-
Environment:Any
-
Assignee Priority:P1
-
ICEsoft Forum Reference:
Description
When the paginator is enabled in the data table, navigating to the next or previous pages via the PgDn and PgUp keys produces multiple requests. The number of requests increases every time these keys are pressed. Depending on the sequence of keys used and the times they are used some flickering might be visible. The flickering is clearly visible when live scrolling is enabled as well.
The reason why this happens is that when the table is recreated it calls its destroy() method to clear the table of event listeners. The problem is that the call to remove the event listener for these keys in the paginator references the event handler of the current (new) instance and not the handler of the previous instance, so nothing gets removed and all these listeners fire at the same time.
So, the onElementUpdate() call has to be fixed or the previous instance has to be passed to the destroy method or a static event handler should be used instead, if possible.
The reason why this happens is that when the table is recreated it calls its destroy() method to clear the table of event listeners. The problem is that the call to remove the event listener for these keys in the paginator references the event handler of the current (new) instance and not the handler of the previous instance, so nothing gets removed and all these listeners fire at the same time.
So, the onElementUpdate() call has to be fixed or the previous instance has to be passed to the destroy method or a static event handler should be used instead, if possible.
r45983: added mechanism to retrieve the previous table instance object and call destroy() on it before recreating the new table instance.
This issue started after introducing client IDs to the table body and table setup script. Because of this, the onElementUpdate() element doesn't fire when only the body and/or the setup script are updated (as opposed to the entire table). As a result, the destroy() method doesn't get called in the previous instance, and many event listeners accumulate. Since adding additional onElementUpdate calls for these specific nodes didn't work, the fix consists in saving a reference to the current table instance in a global variable, and then accessing this instance when the same table is about to be recreated, invoking the destroy() method of the previous instance to remove all the previous event listeners and avoid accumulating them.