@@ -934,7 +934,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
934
934
function compileNodes ( nodeList , transcludeFn , $rootElement , maxPriority , ignoreDirective ,
935
935
previousCompileContext ) {
936
936
var linkFns = [ ] ,
937
- attrs , directives , nodeLinkFn , childNodes , childLinkFn , linkFnFound ;
937
+ attrs , directives , nodeLinkFn , childNodes , childLinkFn , linkFnFound , nodeLinkFnFound ;
938
938
939
939
for ( var i = 0 ; i < nodeList . length ; i ++ ) {
940
940
attrs = new Attributes ( ) ;
@@ -963,6 +963,8 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
963
963
964
964
linkFns . push ( nodeLinkFn , childLinkFn ) ;
965
965
linkFnFound = linkFnFound || nodeLinkFn || childLinkFn ;
966
+ nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn ;
967
+
966
968
//use the previous context only for the first element in the virtual group
967
969
previousCompileContext = null ;
968
970
}
@@ -972,14 +974,23 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
972
974
973
975
function compositeLinkFn ( scope , nodeList , $rootElement , parentBoundTranscludeFn ) {
974
976
var nodeLinkFn , childLinkFn , node , childScope , i , ii , n , childBoundTranscludeFn ;
977
+ var stableNodeList ;
978
+
979
+
980
+ if ( nodeLinkFnFound ) {
981
+ // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our
982
+ // offsets don't get screwed up
983
+ var nodeListLength = nodeList . length ;
984
+ stableNodeList = new Array ( nodeListLength ) ;
975
985
976
- // copy nodeList so that linking doesn't break due to live list updates.
977
- var nodeListLength = nodeList . length ,
978
- stableNodeList = new Array ( nodeListLength ) ;
979
- for ( i = 0 ; i < nodeListLength ; i ++ ) {
980
- stableNodeList [ i ] = nodeList [ i ] ;
986
+ for ( i = 0 ; i < nodeListLength ; i ++ ) {
987
+ stableNodeList [ i ] = nodeList [ i ] ;
988
+ }
989
+ } else {
990
+ stableNodeList = nodeList ;
981
991
}
982
992
993
+ // TODO(perf): when the DOM is sparsely annotated with directives, we spend a lot of time iterating over nulls here
983
994
for ( i = 0 , n = 0 , ii = linkFns . length ; i < ii ; n ++ ) {
984
995
node = stableNodeList [ n ] ;
985
996
nodeLinkFn = linkFns [ i ++ ] ;
0 commit comments