From 3245209bdb9e656622756220c5bbeb80d3ae2eac Mon Sep 17 00:00:00 2001 From: Shyam Seshadri Date: Wed, 2 Jun 2010 17:13:10 -0700 Subject: Add ability to add conditions to ng-required --- src/widgets.js | 11 ++++++++--- test/widgetsSpec.js | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/widgets.js b/src/widgets.js index 09d743e9..42d56e20 100644 --- a/src/widgets.js +++ b/src/widgets.js @@ -35,16 +35,21 @@ function compileValidator(expr) { function valueAccessor(scope, element) { var validatorName = element.attr('ng-validate') || NOOP, validator = compileValidator(validatorName), - required = element.attr('ng-required'), + requiredExpr = element.attr('ng-required'), farmatterName = element.attr('ng-format') || NOOP, formatter = angularFormatter(farmatterName), - format, parse, lastError; + format, parse, lastError, required; invalidWidgets = scope.$invalidWidgets || {markValid:noop, markInvalid:noop}; if (!validator) throw "Validator named '" + validatorName + "' not found."; if (!formatter) throw "Formatter named '" + farmatterName + "' not found."; format = formatter.format; parse = formatter.parse; - required = required || required === ''; + if (requiredExpr) { + scope.$watch(requiredExpr, function(newValue) {required = newValue; validate();}); + } else { + required = requiredExpr === ''; + } + element.data('$validate', validate); return { diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js index 17120682..dc6050b8 100644 --- a/test/widgetsSpec.js +++ b/test/widgetsSpec.js @@ -221,6 +221,29 @@ describe("widget", function(){ expect(element.attr('ng-validation-error')).toEqual('Required'); }); + it('should allow conditions on ng-required', function() { + compile(''); + scope.$set('ineedz', false); + scope.$eval(); + expect(element.hasClass('ng-validation-error')).toBeFalsy(); + expect(element.attr('ng-validation-error')).toBeFalsy(); + + scope.$set('price', 'xxx'); + scope.$eval(); + expect(element.hasClass('ng-validation-error')).toBeFalsy(); + expect(element.attr('ng-validation-error')).toBeFalsy(); + + scope.$set('ineedz', true); + scope.$eval(); + expect(element.hasClass('ng-validation-error')).toBeFalsy(); + expect(element.attr('ng-validation-error')).toBeFalsy(); + + element.val(''); + element.trigger('keyup'); + expect(element.hasClass('ng-validation-error')).toBeTruthy(); + expect(element.attr('ng-validation-error')).toEqual('Required'); + }); + it("should process ng-required2", function() { compile(''); expect(scope.$get('name')).toEqual("Misko"); -- cgit v1.2.3