diff --git a/iron-validatable-behavior.html b/iron-validatable-behavior.html index 803731b..0be57aa 100644 --- a/iron-validatable-behavior.html +++ b/iron-validatable-behavior.html @@ -46,10 +46,11 @@ properties: { /** - * Name of the validator to use. + * Name of the validator to use, or the validating function. + * @type {string|function(Object):boolean} */ validator: { - type: String + type: Object }, /** @@ -140,9 +141,20 @@ return true; }, - __computeValidator: function() { - return Polymer.IronValidatableBehaviorMeta && - Polymer.IronValidatableBehaviorMeta.byKey(this.validator); + /** + * Retrieves the validator. + * + * @param {string|function(Object):boolean} validator + * The validator name or function. + * @return {!{validate: function(Object):boolean}} The validator. + */ + __computeValidator: function(validator) { + if (typeof validator === 'function') { + return {validate: validator}; + } else { + return Polymer.IronValidatableBehaviorMeta && + Polymer.IronValidatableBehaviorMeta.byKey(validator); + } } }; diff --git a/test/iron-validatable-behavior.html b/test/iron-validatable-behavior.html index a8040ef..96df9b2 100644 --- a/test/iron-validatable-behavior.html +++ b/test/iron-validatable-behavior.html @@ -74,13 +74,17 @@ input.validator = 'cats-only'; assert.isFalse(input.validate('ca')); assert.isTrue(input.validate('cats')); + + // Only valid if the value is 'lizards'. + input.validator = (value) => value === 'lizards'; + assert.isFalse(input.validate('cats')); + assert.isTrue(input.validate('lizards')); // Only valid if the value is 'dogs'. input.validator = 'dogs-only'; assert.isFalse(input.validate('cats')); assert.isTrue(input.validate('dogs')); }); - });