VelNaga
VelNaga

Reputation: 3953

Ember-validation how to implement lazy validation

I am using ember-cli:2.5.0 and ember-validations:v2.0.0-alpha.5 In my ember-component i have a validation which is running automatically for each change in a attribute but i want to run this validation only if i call "validate()" method in technical term call validation lazily.

Please find the below code samples,

import Ember from 'ember';
import EmberValidations, { validator } from 'ember-validations';

export default Ember.Component.extend(EmberValidations, {

didReceiveAttrs() {
    this.set('newBook', this._bookModel().create());
},

_bookModel(data = {}) {
return Ember.Object.extend(EmberValidations, {
  bookVersion: null,
  isEditable: false,
  validationActive: false,
  validations: {
    bookVersion: {
      inline: validator(function() {
if(this.validationActive){ //Here this.validationActive always return undefined
        var version = this.model.get('bookVersion') || "",
          message = [];

         if (Ember.isEmpty(bookVersion)) {
           message.push("Book Version is mandatory!!!");
         }

        if (message.length > 0) {
          return message.join(',');
        }
        }
      })
    }
  }
}, data);
}

});

actions: {
        this.get('newBook').set("validationActive",true);
        this.get('newBook').validate().then(() => {
             //Do the action
        }
}

I want the above validation to run only calling "this.get('newBook').validate()". I am entirely new to ember so down-voter please put your comments before down-voting for others kindly let me know for any more code samples.

Your help should be appreciable.

Upvotes: 0

Views: 430

Answers (1)

feanor07
feanor07

Reputation: 3368

The addon you are using for validations ("ember-validations") is a very popular one and its documentation is pretty well when compared to others. If you look at the documentation there is a part named "Conditional Validators" in documentation. You can use a boolean property to control when the validation is to be performed.

You can see an illustration of what I mean in the following twiddle. I have created a simple validation within the application controller for user's name. The name field must have a length of at least 5 and the validation is to be performed only if the condition validationActive is true. Initially; the condition is false; which means validator did not work and isValid property of Controller (which is inherited from EmberValidations Mixin) is true. If you toggle the property with the button provided; the validation will run (since the condition is now set to true; hence validation is triggered) and isValid will return to false. If you change the value; the validation result will change appropriately with respect to the value of user's name. If you toggle the condition once again to set it to false; then isValid will become true no matter what the valie of user's name is.

I hope this gives you an insight about how to control when your validations should work.

Here is what you should do after your edit: The field is undefined because you are trying to reach component's own validationActive field within inline validator. Please get validationActive as follows this.model.get('validationActive') and give a try. It should work.

Upvotes: 1

Related Questions