FLEX-34778
CAUSE: When a node is opened, HierarchicalCollectionView starts to listen to 
changes to its children collection. And when it's closed, it doesn't stop 
listening to these CollectionEvents. So when a closed node's child is replaced, 
nestedCollectionChangeHandler is triggered, even if the node itself is closed. 
Part of nestedCollectionChangeHandler's function is to dispatch a REMOVE 
CollectionEvent for all the nodes which were removed by the replacement (which 
is, all the descendants of the replaced - but closed! - node). Then, since the 
node that's being replaced is not accessible anymore (because its parent was 
closed), it's not added to convertedEvent.items. But the next lines assume that 
the replaced node will be in that array without mistake. Otherwise (as it 
happens in this bus) it goes into an infinite loop trying to find it.

SOLUTION: instead of looking for the node with an (indefinitely) incrementing 
index, we're now using Array.indexOf() to locate the node and remove it if it's 
found.


Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/32f39500
Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/32f39500
Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/32f39500

Branch: refs/heads/develop
Commit: 32f39500d34d05c14282cdafcef7ae494783df85
Parents: ab0943c
Author: Mihai Chira <[email protected]>
Authored: Tue Mar 10 13:00:10 2015 +0100
Committer: Mihai Chira <[email protected]>
Committed: Tue Mar 10 13:00:10 2015 +0100

----------------------------------------------------------------------
 .../src/mx/collections/HierarchicalCollectionView.as | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/32f39500/frameworks/projects/advancedgrids/src/mx/collections/HierarchicalCollectionView.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/advancedgrids/src/mx/collections/HierarchicalCollectionView.as
 
b/frameworks/projects/advancedgrids/src/mx/collections/HierarchicalCollectionView.as
index 6d4901c..d752e8e 100644
--- 
a/frameworks/projects/advancedgrids/src/mx/collections/HierarchicalCollectionView.as
+++ 
b/frameworks/projects/advancedgrids/src/mx/collections/HierarchicalCollectionView.as
@@ -1152,7 +1152,7 @@ public class HierarchicalCollectionView extends 
EventDispatcher
     private function internalRefresh(dispatch:Boolean):Boolean
     {
         var obj:Object;
-        var coll:ICollectionView
+        var coll:ICollectionView;
         var needUpdate:Boolean = false;
         
         // apply filter function to all the collections including the child 
collections
@@ -1531,9 +1531,9 @@ public class HierarchicalCollectionView extends 
EventDispatcher
                 for (i = 0; i < n; i++)
                 {
                     node = ce.items[i].oldValue;
-                    while (convertedEvent.items[j] != node)
-                        j++;
-                    convertedEvent.items.splice(j, 1);
+                    var replacedNodePosition:int = 
convertedEvent.items.indexOf(node);
+                    if(replacedNodePosition != -1)
+                        convertedEvent.items.splice(replacedNodePosition, 1);
                 }
                 if (convertedEvent.items.length)
                 {
@@ -1654,9 +1654,10 @@ public class HierarchicalCollectionView extends 
EventDispatcher
                     changingNode = ce.items[i].oldValue;
                     if (changingNode is XML)
                         stopTrackUpdates(changingNode);
-                    while (convertedEvent.items[j] != changingNode)
-                        j++;
-                    convertedEvent.items.splice(j, 1);
+
+                    var replacedNodePosition:int = 
convertedEvent.items.indexOf(changingNode);
+                    if(replacedNodePosition != -1)
+                        convertedEvent.items.splice(replacedNodePosition, 1);
                 }
                 if (convertedEvent.items.length)
                 {

Reply via email to