diff --git a/src/ng/directive/ngPluralize.js b/src/ng/directive/ngPluralize.js index b7d3e089731b..d8d61a0a96e2 100644 --- a/src/ng/directive/ngPluralize.js +++ b/src/ng/directive/ngPluralize.js @@ -172,6 +172,15 @@ person2.sendKeys('Vojta'); expect(withOffset.getText()).toEqual('Di, Vojta and 2 other people are viewing.'); }); + it('should reset count to 0 if count - offset is negative', function() { + var withOffset = element.all(by.css('ng-pluralize')).get(1); + var personCount = element(by.model('personCount')); + personCount.clear(); + personCount.sendKeys('4'); + expect(withOffset.getText()).toEqual('Igor, Misko and 2 other people are viewing.'); + personCount.clear(); + expect(withOffset.getText()).toEqual('Nobody is viewing.'); + }); */ @@ -189,10 +198,19 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale, whensExpFns = {}, startSymbol = $interpolate.startSymbol(), endSymbol = $interpolate.endSymbol(), - braceReplacement = startSymbol + numberExp + '-' + offset + endSymbol, watchRemover = angular.noop, lastCount; + var oneTimeCount = /^\s*::/.test(numberExp) || ''; + if (oneTimeCount) { + numberExp = numberExp.replace(/^\s*::/, ''); + oneTimeCount = '::'; + } + var braceReplacement = [ + startSymbol, oneTimeCount, '((', numberExp, '-', offset, + ') < 0 ?', 0, ':', numberExp, '-', offset, ')', endSymbol + ].join(''); + forEach(attr, function(expression, attributeName) { var tmpMatch = IS_WHEN.exec(attributeName); if (tmpMatch) { @@ -205,14 +223,14 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale, }); - scope.$watch(numberExp, function ngPluralizeWatchAction(newVal) { + scope.$watch(oneTimeCount + numberExp, function ngPluralizeWatchAction(newVal) { var count = parseFloat(newVal); var countIsNaN = isNaN(count); if (!countIsNaN && !(count in whens)) { // If an explicit number rule such as 1, 2, 3... is defined, just use it. // Otherwise, check it against pluralization rules in $locale service. - count = $locale.pluralCat(count - offset); + count = $locale.pluralCat(count - offset < 0 ? 0 : count - offset); } // If both `count` and `lastCount` are NaN, we don't need to re-register a watch. diff --git a/test/ng/directive/ngPluralizeSpec.js b/test/ng/directive/ngPluralizeSpec.js index 0ff0c668fb9c..67e1f1f1f692 100644 --- a/test/ng/directive/ngPluralizeSpec.js +++ b/test/ng/directive/ngPluralizeSpec.js @@ -63,18 +63,18 @@ describe('ngPluralize', function() { $rootScope.email = -0.1; $rootScope.$digest(); - expect(element.text()).toBe('You have -0.1 new emails'); - expect(elementAlt.text()).toBe('You have -0.1 new emails'); + expect(element.text()).toBe('You have 0 new emails'); + expect(elementAlt.text()).toBe('You have 0 new emails'); $rootScope.email = '-0.01'; $rootScope.$digest(); - expect(element.text()).toBe('You have -0.01 new emails'); - expect(elementAlt.text()).toBe('You have -0.01 new emails'); + expect(element.text()).toBe('You have 0 new emails'); + expect(elementAlt.text()).toBe('You have 0 new emails'); $rootScope.email = -2; $rootScope.$digest(); - expect(element.text()).toBe('You have -2 new emails'); - expect(elementAlt.text()).toBe('You have -2 new emails'); + expect(element.text()).toBe('You have 0 new emails'); + expect(elementAlt.text()).toBe('You have 0 new emails'); $rootScope.email = -1; $rootScope.$digest(); @@ -111,8 +111,8 @@ describe('ngPluralize', function() { $rootScope.email = '-011'; $rootScope.$digest(); - expect(element.text()).toBe('You have -11 new emails'); - expect(elementAlt.text()).toBe('You have -11 new emails'); + expect(element.text()).toBe('You have 0 new emails'); + expect(elementAlt.text()).toBe('You have 0 new emails'); $rootScope.email = '1fff'; $rootScope.$digest();