Add ability to add conditions to ng-required

This commit is contained in:
Shyam Seshadri 2010-06-02 17:13:10 -07:00
parent 39312d1fe3
commit 3245209bdb
2 changed files with 31 additions and 3 deletions

View file

@ -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 {

View file

@ -221,6 +221,29 @@ describe("widget", function(){
expect(element.attr('ng-validation-error')).toEqual('Required');
});
it('should allow conditions on ng-required', function() {
compile('<input type="text" name="price" ng-required="ineedz"/>');
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('<textarea name="name">Misko</textarea>');
expect(scope.$get('name')).toEqual("Misko");