diff --git a/src/ng/compile.js b/src/ng/compile.js index e1aba35b8db3..f5a192cacd86 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -865,6 +865,7 @@ function $CompileProvider($provide) { var srcAttr = src.$attr, dstAttr = dst.$attr, $element = dst.$$element; + // reapply the old attributes to the new element forEach(dst, function(value, key) { if (key.charAt(0) != '$') { @@ -874,10 +875,12 @@ function $CompileProvider($provide) { dst.$set(key, value, true, srcAttr[key]); } }); + // copy the new attributes on the old attrs object forEach(src, function(value, key) { if (key == 'class') { safeAddClass($element, value); + dst.class = (dst.class ? dst.class + ' ' : '') + value; } else if (key == 'style') { $element.attr('style', $element.attr('style') + ';' + value); } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) { diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index e0283c7ca0c3..d33689e5462c 100644 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -388,6 +388,14 @@ describe('$compile', function() { expect(element).toBe(attr.$$element); } })); + directive('replaceWithInterpolatedClass', valueFn({ + replace: true, + template: '
Replace with interpolated class!
', + compile: function(element, attr) { + attr.$set('compiled', 'COMPILED'); + expect(element).toBe(attr.$$element); + } + })); })); @@ -466,6 +474,14 @@ describe('$compile', function() { })); + it('should handle interpolated css from replacing directive', inject( + function($compile, $rootScope) { + element = $compile('
')($rootScope); + $rootScope.$digest(); + expect(element).toHaveClass('class_2'); + })); + + it('should merge interpolated css class', inject(function($compile, $rootScope) { element = $compile('
')($rootScope);