diff --git a/src/ng/compile.js b/src/ng/compile.js index 0bb6e386eddc..4afb7caee72a 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -3837,7 +3837,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { pre: function ngPropPreLinkFn(scope, $element) { function applyPropValue() { var propValue = ngPropGetter(scope); - $element.prop(propName, sanitizer(propValue)); + $element[0][propName] = sanitizer(propValue); } applyPropValue(); diff --git a/test/ng/ngPropSpec.js b/test/ng/ngPropSpec.js index 9b4f9fab0637..ddbe0d36b63a 100644 --- a/test/ng/ngPropSpec.js +++ b/test/ng/ngPropSpec.js @@ -49,6 +49,48 @@ describe('ngProp*', function() { expect(element.prop('asdf')).toBe(true); })); + // https://github.com/angular/angular.js/issues/16797 + it('should support falsy property values', inject(function($rootScope, $compile) { + var element = $compile('')($rootScope); + // Initialize to truthy value + $rootScope.myText = 'abc'; + $rootScope.$digest(); + expect(element.prop('text')).toBe('abc'); + + // Assert various falsey values get assigned to the property + $rootScope.myText = ''; + $rootScope.$digest(); + expect(element.prop('text')).toBe(''); + $rootScope.myText = 0; + $rootScope.$digest(); + expect(element.prop('text')).toBe(0); + $rootScope.myText = false; + $rootScope.$digest(); + expect(element.prop('text')).toBe(false); + $rootScope.myText = undefined; + $rootScope.$digest(); + expect(element.prop('text')).toBeUndefined(); + $rootScope.myText = null; + $rootScope.$digest(); + expect(element.prop('text')).toBe(null); + })); + + it('should directly map special properties (class)', inject(function($rootScope, $compile) { + var element = $compile('')($rootScope); + $rootScope.myText = 'abc'; + $rootScope.$digest(); + expect(element[0].class).toBe('abc'); + expect(element).not.toHaveClass('abc'); + })); + + it('should not use jQuery .prop() to avoid jQuery propFix/hooks', inject(function($rootScope, $compile) { + var element = $compile('')($rootScope); + spyOn(jqLite.prototype, 'prop'); + $rootScope.myText = 'abc'; + $rootScope.$digest(); + expect(jqLite.prototype.prop).not.toHaveBeenCalled(); + })); + it('should support mixed case using underscore-separated names', inject(function($rootScope, $compile) { var element = $compile('')($rootScope); $rootScope.value = 123;
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: