Backbone.js check collection

Backbone.js offers validation for models. But there is no easy way to check if all the models in the collection are valid. There is no .isValid property for collections.

I use hack like this:

 _.isEmpty(_.filter(myCollection.models, function(m) {return m.validationError;})) 

Is there a more optimized way to β€œvalidate” a collection?

+7
source share
4 answers

How about using the some method?

 var hasErrors = _.some(myCollection.models, function(m) { return m.validationError; }); 
+8
source

A collection of BackboneJS delegates to some UnderscoreJS methods, such as some . You can use it like this:

 var hasErrors = myCollection.some(function(model) { return model.validationError; }); 
+3
source

lodash.js supports this construction (with the abbreviation callback "_.pluck"):

 _.some(myCollection.models, 'validationError'); 
+1
source

I know this is an old question, but please see my solution to this problem. In short, it is available as github repo backbone-collection-validation . Now, to the details. To check the assembly in this way

 Collection = Backbone.Collection.extend({ validate: function (collection) { var nonExistIds = []; _.forEach(collection, function (model) { var friends = model.get('friends'); if (friends && friends.length) { for (var i = friends.length - 1; i >= 0; i--) { if (!this.get(friends[i])) { nonExistIds.push(friends[i]); } } } }, this); if (nonExistIds.length) { return 'Persons with id: ' + nonExistIds + ' don\'t exist in the collection.'; } } }) 

You need to expand your base with

 //This implementation is called simple because it // * allows to set invalid models into collection. Validation only will trigger // an event 'invalid' and nothing more. var parentSet = Backbone.Collection.prototype.set; Backbone.Collection.prototype.set = function (models, options) { var parentResult = parentSet.apply(this, arguments); if (options && options.validate) { if (!_.isFunction(this.validate)) { throw new Error('Cannot validate a collection without the `validate` method'); } var errors = this.validate(this.models); if (errors) { this.trigger('invalid', this, errors); } } return parentResult; }; 

or with this

 //This implementation is called advanced because it // * doesn't allow to set invalid models into collection. var parentSet = Backbone.Collection.prototype.set; Backbone.Collection.prototype.set = function (models, options) { if (!options || !options.validate) { return parentSet.apply(this, arguments); } else { if (!_.isFunction(this.validate)) { throw new Error('Cannot validate a collection without the `validate` method'); } var clones = []; _.forEach(this.models, function (model) { clones.push(model.clone()); }, this); var exModels = this.models; this.reset(clones); var exSilent = options.silent; options.silent = true; parentSet.apply(this, arguments); var errors = this.validate(this.models); this.reset(exModels); if (typeof exSilent === 'undefined') { delete options.silent; } else { options.silent = exSilent; } if (errors) { this.trigger('invalid', this, errors); return this; } else { return parentSet.apply(this, arguments); } } }; 
0
source

All Articles