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('
ignore
')($rootScope);