aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Santos2013-05-07 17:45:28 +0100
committerPete Bacon Darwin2013-05-14 21:29:21 +0100
commitd551d72924f7c43a043e4760ff05d7389e310f99 (patch)
tree1c7f46aee3b08d439921b32e4469193eefb19f25
parent629fb37351ce5778a40a8bc8cd7c1385b382ce75 (diff)
downloadangular.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.js29
-rw-r--r--test/ng/directive/booleanAttrsSpec.js18
-rw-r--r--test/ng/directive/ngSrcsetSpec.js16
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');
+ }));
+});