I'm using the Backbone Validation plugin and would like to selectively validate different sets of model attributes at different times, is this possible?
My test model has validation for name
, age
and address
and if I wanted to validate only address
, how would I do this?
I thought it was a case of calling this.model.validate('address');
but all the validation rules seem to run?
JS
console.clear();
const Model = Backbone.Model.extend({
validation: {
name: {
required: true
},
age: {
range: [1, 80],
required: true
},
address: {
minLength: 1,
msg: 'Address required',
required: false
}
}
});
const View = Backbone.View.extend({
template: Handlebars.compile( $('.tmpl-person').html() ),
className: 'view',
events: {
'click .js-action--validate-keys': 'actionValidateKeysClicked',
'click .js-action--validate-key': 'actionValidateKeyClicked'
},
initialize() {
Backbone.Validation.bind(this);
this.listenTo(this.model, 'validated', this.onModelValidated, this);
this.listenTo(this.model, 'validated:valid', this.onModelValid, this);
this.listenTo(this.model, 'validated:invalid', this.onModelInvalid, this);
},
render() {
this.$el.html(this.template(this.model.toJSON()));
return this;
},
actionValidateKeysClicked(event) {
event.preventDefault();
console.log('actionValidateKeysClicked');
this.model.set({
'name': 'Joe Bloggs',
'age': 23
});
this.model.validate(['name', 'age']);
},
actionValidateKeyClicked(event) {
event.preventDefault();
console.log('actionValidateKeyClicked');
this.model.set('address', '123 ABC');
this.model.validate('address');
},
/**
* The validated event is triggered after validation is performed, either it was successful or not.
* isValid is true or false depending on the result of the validation.
*/
onModelValidated(isValid, model, errors) {
console.log('onModelValidated', isValid, model, errors);
},
onModelValid(model) {
console.log('onModelValid', model);
},
onModelInvalid(model, errors) {
console.log('onModelInvalid', model, errors);
}
});
const newModel = new Model();
const newView = new View({
model: newModel
});
document.body.append(newView.render().el);
JSfiddle http://jsfiddle.net/kyllle/qmx2y9yr/
isValid
To validate only certain fields, Backbone.Validation offers a modified version of
isValid
.isValid
will trigger an'invalid'
event (source) only if there's an error with the validation, and won't trigger a'validated'
event or a'validated:valid'
.preValidate
Demo
I took your code and made a small example below to demonstrate that the invalid event is not triggered when using
isValid
, but it is trigger when usingvalidate
. Also, note that no events are triggered withpreValidate
.Additional information
Side note
Notice how I used
listenTo
with an object instead of calling it 3 times.Also, there's no
this
argument to pass tolistenTo
, It's probably a confusion with the oldon
/bind
syntax.