diff options
| author | Samuel Santos | 2013-05-07 17:45:28 +0100 |
|---|---|---|
| committer | Pete Bacon Darwin | 2013-05-14 21:29:21 +0100 |
| commit | d551d72924f7c43a043e4760ff05d7389e310f99 (patch) | |
| tree | 1c7f46aee3b08d439921b32e4469193eefb19f25 | |
| parent | 629fb37351ce5778a40a8bc8cd7c1385b382ce75 (diff) | |
| download | angular.js-d551d72924f7c43a043e4760ff05d7389e310f99.tar.bz2 | |
feat(ngSrcset): add new ngSrcset directive
In line with ngSrc and ngHref, this new directive ensures that the
`srcset` HTML5 attribute does not include a pre-interpolated string.
Without it the browser will fetch from the URL with the literal text
`{{hash}}` until AngularJS replaces the expression inside `{{hash}}`.
Closes #2601
| -rw-r--r-- | src/ng/directive/booleanAttrs.js | 29 | ||||
| -rw-r--r-- | test/ng/directive/booleanAttrsSpec.js | 18 | ||||
| -rw-r--r-- | test/ng/directive/ngSrcsetSpec.js | 16 |
3 files changed, 60 insertions, 3 deletions
diff --git a/src/ng/directive/booleanAttrs.js b/src/ng/directive/booleanAttrs.js index 7e0e3a42..8f7399a6 100644 --- a/src/ng/directive/booleanAttrs.js +++ b/src/ng/directive/booleanAttrs.js @@ -107,6 +107,31 @@ /** * @ngdoc directive + * @name ng.directive:ngSrcset + * @restrict A + * + * @description + * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't + * work right: The browser will fetch from the URL with the literal + * text `{{hash}}` until Angular replaces the expression inside + * `{{hash}}`. The `ngSrcset` directive solves this problem. + * + * The buggy way to write it: + * <pre> + * <img srcset="http://www.gravatar.com/avatar/{{hash}} 2x"/> + * </pre> + * + * The correct way to write it: + * <pre> + * <img ng-srcset="http://www.gravatar.com/avatar/{{hash}} 2x"/> + * </pre> + * + * @element IMG + * @param {template} ngSrcset any string which can contain `{{}}` markup. + */ + +/** + * @ngdoc directive * @name ng.directive:ngDisabled * @restrict A * @@ -325,8 +350,8 @@ forEach(BOOLEAN_ATTR, function(propName, attrName) { }); -// ng-src, ng-href are interpolated -forEach(['src', 'href'], function(attrName) { +// ng-src, ng-srcset, ng-href are interpolated +forEach(['src', 'srcset', 'href'], function(attrName) { var normalized = directiveNormalize('ng-' + attrName); ngAttributeAliasDirectives[normalized] = function() { return { diff --git a/test/ng/directive/booleanAttrsSpec.js b/test/ng/directive/booleanAttrsSpec.js index 0ce6b555..aa48afff 100644 --- a/test/ng/directive/booleanAttrsSpec.js +++ b/test/ng/directive/booleanAttrsSpec.js @@ -88,7 +88,6 @@ describe('boolean attr directives', function() { describe('ngSrc', function() { - it('should interpolate the expression and bind to src', inject(function($compile, $rootScope) { var element = $compile('<div ng-src="some/{{id}}"></div>')($rootScope); @@ -126,6 +125,23 @@ describe('ngSrc', function() { }); +describe('ngSrcset', function() { + it('should interpolate the expression and bind to srcset', inject(function($compile, $rootScope) { + var element = $compile('<div ng-srcset="some/{{id}} 2x"></div>')($rootScope); + + $rootScope.$digest(); + expect(element.attr('srcset')).toEqual('some/ 2x'); + + $rootScope.$apply(function() { + $rootScope.id = 1; + }); + expect(element.attr('srcset')).toEqual('some/1 2x'); + + dealoc(element); + })); +}); + + describe('ngHref', function() { var element; diff --git a/test/ng/directive/ngSrcsetSpec.js b/test/ng/directive/ngSrcsetSpec.js new file mode 100644 index 00000000..8fccb00a --- /dev/null +++ b/test/ng/directive/ngSrcsetSpec.js @@ -0,0 +1,16 @@ +'use strict'; + +describe('ngSrcset', function() { + var element; + + afterEach(function() { + dealoc(element); + }); + + it('should not result empty string in img srcset', inject(function($rootScope, $compile) { + $rootScope.image = {}; + element = $compile('<img ng-srcset="{{image.url}} 2x">')($rootScope); + $rootScope.$digest(); + expect(element.attr('srcset')).toEqual(' 2x'); + })); +}); |
