@@ -987,9 +987,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
987
987
( nodeLinkFn . transcludeOnThisElement || ! nodeLinkFn . templateOnThisElement )
988
988
&& nodeLinkFn . transclude ) : transcludeFn ) ;
989
989
990
- linkFns . push ( nodeLinkFn , childLinkFn ) ;
991
- linkFnFound = linkFnFound || nodeLinkFn || childLinkFn ;
992
- nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn ;
990
+ if ( nodeLinkFn || childLinkFn ) {
991
+ linkFns . push ( i , nodeLinkFn , childLinkFn ) ;
992
+ linkFnFound = true ;
993
+ nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn ;
994
+ }
993
995
994
996
//use the previous context only for the first element in the virtual group
995
997
previousCompileContext = null ;
@@ -999,7 +1001,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
999
1001
return linkFnFound ? compositeLinkFn : null ;
1000
1002
1001
1003
function compositeLinkFn ( scope , nodeList , $rootElement , parentBoundTranscludeFn ) {
1002
- var nodeLinkFn , childLinkFn , node , childScope , i , ii , n , childBoundTranscludeFn ;
1004
+ var nodeLinkFn , childLinkFn , node , childScope , i , ii , idx , childBoundTranscludeFn ;
1003
1005
var stableNodeList ;
1004
1006
1005
1007
@@ -1009,16 +1011,17 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
1009
1011
var nodeListLength = nodeList . length ;
1010
1012
stableNodeList = new Array ( nodeListLength ) ;
1011
1013
1012
- for ( i = 0 ; i < nodeListLength ; i ++ ) {
1013
- stableNodeList [ i ] = nodeList [ i ] ;
1014
+ // create a sparse array by only copying the elements which have a linkFn
1015
+ for ( i = 0 ; i < linkFns . length ; i += 3 ) {
1016
+ idx = linkFns [ i ] ;
1017
+ stableNodeList [ idx ] = nodeList [ idx ] ;
1014
1018
}
1015
1019
} else {
1016
1020
stableNodeList = nodeList ;
1017
1021
}
1018
1022
1019
- // TODO(perf): when the DOM is sparsely annotated with directives, we spend a lot of time iterating over nulls here
1020
- for ( i = 0 , n = 0 , ii = linkFns . length ; i < ii ; n ++ ) {
1021
- node = stableNodeList [ n ] ;
1023
+ for ( i = 0 , ii = linkFns . length ; i < ii ; ) {
1024
+ node = stableNodeList [ linkFns [ i ++ ] ] ;
1022
1025
nodeLinkFn = linkFns [ i ++ ] ;
1023
1026
childLinkFn = linkFns [ i ++ ] ;
1024
1027
0 commit comments