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/
isValidTo validate only certain fields, Backbone.Validation offers a modified version of
isValid.isValidwill 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'.preValidateDemo
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
listenTowith an object instead of calling it 3 times.Also, there's no
thisargument to pass tolistenTo, It's probably a confusion with the oldon/bindsyntax.