From c47abd0dd7490576f4b84ee51ebaca385c1036da Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Wed, 20 Nov 2013 11:04:38 -0800 Subject: [PATCH] fix(ngInclude): allow ngInclude to load scripts when jQuery is included In 1.2, the behavior of ngInclude was modified to use DOM APIs rather than jqLite. This means that even when jQuery was loaded, ngInclude was not calling into it, and thus scripts were not eval'd as they had been before. Although the use of ngInclude to eval scripts as a lazy-loading strategy was never an intentional feature, this patch restores the ability to do so. Closes #3756 --- src/ng/animate.js | 15 ++++++++------- test/ng/directive/ngIncludeSpec.js | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/ng/animate.js b/src/ng/animate.js index bb08410ccc67..b662d9c18cdf 100644 --- a/src/ng/animate.js +++ b/src/ng/animate.js @@ -99,13 +99,14 @@ var $AnimateProvider = ['$provide', function($provide) { * inserted into the DOM */ enter : function(element, parent, after, done) { - var afterNode = after && after[after.length - 1]; - var parentNode = parent && parent[0] || afterNode && afterNode.parentNode; - // IE does not like undefined so we have to pass null. - var afterNextSibling = (afterNode && afterNode.nextSibling) || null; - forEach(element, function(node) { - parentNode.insertBefore(node, afterNextSibling); - }); + if (after) { + after.after(element); + } else { + if (!parent || !parent[0]) { + parent = after.parent(); + } + parent.append(element); + } done && $timeout(done, 0, false); }, diff --git a/test/ng/directive/ngIncludeSpec.js b/test/ng/directive/ngIncludeSpec.js index aba71e44ce9c..59f8b4aebc48 100644 --- a/test/ng/directive/ngIncludeSpec.js +++ b/test/ng/directive/ngIncludeSpec.js @@ -312,6 +312,31 @@ describe('ngInclude', function() { })); + it('should exec scripts when jQuery is included', inject(function($compile, $rootScope, $httpBackend) { + if (!jQuery) { + return; + } + + element = $compile('
')($rootScope); + + // the element needs to be appended for the script to run + element.appendTo(document.body); + window._ngIncludeCausesScriptToRun = false; + $httpBackend.expect('GET', 'url1').respond(''); + $rootScope.includeUrl = 'url1'; + $rootScope.$digest(); + $httpBackend.flush(); + + expect(window._ngIncludeCausesScriptToRun).toBe(true); + + // IE8 doesn't like deleting properties of window + window._ngIncludeCausesScriptToRun = undefined; + try { + delete window._ngIncludeCausesScriptToRun; + } catch (e) {} + })); + + describe('autoscroll', function() { var autoScrollSpy;