Skip to content

Commit 4b42994

Browse files
committed
fix(ngInclude): correctly add non-html namespaced template content
It is now possible for ngInclude to correctly load SVG content in non-blink browsers, which do not sort out the namespace when parsing HTML. Closes angular#7538
1 parent 2a5af50 commit 4b42994

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

src/ng/directive/ngInclude.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,10 @@ var ngIncludeFillContentDirective = ['$compile',
267267
priority: -400,
268268
require: 'ngInclude',
269269
link: function(scope, $element, $attr, ctrl) {
270-
$element.html(ctrl.template);
271-
$compile($element.contents())(scope);
270+
$element.empty();
271+
$compile(ctrl.template)(scope, function namespaceAdaptedClone(clone) {
272+
$element.append(clone);
273+
}, undefined, undefined, $element);
272274
}
273275
};
274276
}];

test/ng/directive/ngIncludeSpec.js

+21
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,27 @@ describe('ngInclude and transcludes', function() {
590590
expect(root[0]).toBe(element[0]);
591591
});
592592
});
593+
594+
595+
it('should correctly work with SVG content', function() {
596+
if (!window.SVGRectElement) return;
597+
module(function() {
598+
directive('test', valueFn({
599+
templateNamespace: 'svg',
600+
templateUrl: 'my-rect.html',
601+
replace: true
602+
}));
603+
});
604+
inject(function($compile, $rootScope, $httpBackend) {
605+
$httpBackend.expectGET('my-rect.html').respond('<g ng-include="\'include.svg\'"></g>');
606+
$httpBackend.expectGET('include.svg').respond('<rect></rect>');
607+
element = $compile('<svg><test></test></svg>')($rootScope);
608+
$httpBackend.flush();
609+
var child = element.find('rect');
610+
expect(child.length).toBe(1);
611+
expect(child[0] instanceof SVGRectElement).toBe(true);
612+
});
613+
});
593614
});
594615

595616
describe('ngInclude animations', function() {

0 commit comments

Comments
 (0)