diff --git a/src/ng/compile.js b/src/ng/compile.js
index 4d83f379d22f..2bb85f66e8e7 100644
--- a/src/ng/compile.js
+++ b/src/ng/compile.js
@@ -1157,7 +1157,8 @@ function $CompileProvider($provide) {
replaceDirective = originalReplaceDirective,
childTranscludeFn = transcludeFn,
linkFn,
- directiveValue;
+ directiveValue,
+ directiveValueTrimmed;
// executes all directives on the current element
for(var i = 0, ii = directives.length; i < ii; i++) {
@@ -1250,11 +1251,25 @@ function $CompileProvider($provide) {
if (directive.replace) {
replaceDirective = directive;
- $template = jqLite('
' +
- trim(directiveValue) +
- '
').contents();
- compileNode = $template[0];
+ directiveValueTrimmed = trim(directiveValue);
+
+ // Special case for table elements that cannot be wrapped in a div
+ if (directiveValueTrimmed.indexOf('
' + directiveValueTrimmed + '').children().contents();
+ }
+ else if (['' + directiveValueTrimmed + '').contents();
+ }
+ else if ([' | ' + directiveValueTrimmed + '
').children().children().contents();
+ }
+ else {
+ $template = jqLite('' + directiveValueTrimmed + '
').contents();
+ }
+
+ compileNode = $template[0];
if ($template.length != 1 || compileNode.nodeType !== 1) {
throw $compileMinErr('tplrt',
"Template for directive '{0}' must have exactly one root element. {1}",
diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js
index 85ee17d2ae6e..c8e1ea5b3c80 100755
--- a/test/ng/compileSpec.js
+++ b/test/ng/compileSpec.js
@@ -504,6 +504,16 @@ describe('$compile', function() {
expect(element).toBe(attr.$$element);
}
}));
+
+ directive('replaceTr', valueFn({
+ replace: true,
+ template: 'Replace! |
',
+ compile: function(element, attr) {
+ attr.$set('compiled', 'COMPILED');
+ expect(element).toBe(attr.$$element);
+ }
+ }));
+
directive('replaceWithInterpolatedStyle', valueFn({
replace: true,
template: 'Replace with interpolated style!
',
@@ -512,8 +522,104 @@ describe('$compile', function() {
expect(element).toBe(attr.$$element);
}
}));
+
+ directive('replaceTd', valueFn({
+ replace: true,
+ template: 'Replace! | ',
+ compile: function(element, attr) {
+ attr.$set('compiled', 'COMPILED');
+ expect(element).toBe(attr.$$element);
+ }
+ }));
+
+ directive('replaceTh', valueFn({
+ replace: true,
+ template: 'Replace! | ',
+ compile: function(element, attr) {
+ attr.$set('compiled', 'COMPILED');
+ expect(element).toBe(attr.$$element);
+ }
+ }));
+
+ directive('replaceThead', valueFn({
+ replace: true,
+ template: 'Replace! |
',
+ compile: function(element, attr) {
+ attr.$set('compiled', 'COMPILED');
+ expect(element).toBe(attr.$$element);
+ }
+ }));
+
+ directive('replaceTbody', valueFn({
+ replace: true,
+ template: 'Replace! |
',
+ compile: function(element, attr) {
+ attr.$set('compiled', 'COMPILED');
+ expect(element).toBe(attr.$$element);
+ }
+ }));
+
+ directive('replaceTfoot', valueFn({
+ replace: true,
+ template: 'Replace! |
',
+ compile: function(element, attr) {
+ attr.$set('compiled', 'COMPILED');
+ expect(element).toBe(attr.$$element);
+ }
+ }));
+
+ directive('replaceCaption', valueFn({
+ replace: true,
+ template: 'Replace!',
+ compile: function(element, attr) {
+ attr.$set('compiled', 'COMPILED');
+ expect(element).toBe(attr.$$element);
+ }
+ }));
+
}));
+ it('should replace tr element with template', inject(function($compile, $rootScope) {
+ element = $compile('')($rootScope);
+ expect(element.text()).toEqual('Replace!');
+ expect(element.find('tr').attr('compiled')).toEqual('COMPILED');
+ }));
+
+ it('should replace td element with template', inject(function($compile, $rootScope) {
+ element = $compile('')($rootScope);
+ expect(element.text()).toEqual('Replace!');
+ expect(element.find('td').attr('compiled')).toEqual('COMPILED');
+ }));
+
+ it('should replace th element with template', inject(function($compile, $rootScope) {
+ element = $compile('')($rootScope);
+ expect(element.text()).toEqual('Replace!');
+ expect(element.find('th').attr('compiled')).toEqual('COMPILED');
+ }));
+
+ it('should replace thead element with template', inject(function($compile, $rootScope) {
+ element = $compile('')($rootScope);
+ expect(element.find('td').text()).toEqual('Replace!');
+ expect(element.find('thead').attr('compiled')).toEqual('COMPILED');
+ }));
+
+ it('should replace tbody element with template', inject(function($compile, $rootScope) {
+ element = $compile('')($rootScope);
+ expect(element.find('td').text()).toEqual('Replace!');
+ expect(element.find('tbody').attr('compiled')).toEqual('COMPILED');
+ }));
+
+ it('should replace tfoot element with template', inject(function($compile, $rootScope) {
+ element = $compile('')($rootScope);
+ expect(element.find('td').text()).toEqual('Replace!');
+ expect(element.find('tfoot').attr('compiled')).toEqual('COMPILED');
+ }));
+
+ it('should replace caption element with template', inject(function($compile, $rootScope) {
+ element = $compile('')($rootScope);
+ expect(element.find('caption').text()).toEqual('Replace!');
+ expect(element.find('caption').attr('compiled')).toEqual('COMPILED');
+ }));
it('should replace element with template', inject(function($compile, $rootScope) {
element = $compile('