Tôi biết rằng đây là một câu hỏi cũ nhưng hãy nhìn vào quyết định của tôi cho vấn đề này. Trong ngắn hạn, nó có sẵn như github repo backbone-collection-validation. Bây giờ, để biết chi tiết. Để xác nhận bộ sưu tập như thế này
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.';
}
}
})
Bạn cần phải mở rộng Backbone của bạn với điều này
//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;
};
hoặc với điều này
//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);
}
}
};
Dường như chỉ lặp qua bộ sưu tập và kiểm tra .isValid sẽ làm những gì bạn đang yêu cầu. Sử dụng. Để làm việc lặp lại ... – kinakuta