Sto tentando di sperimentare e vedere se esistono soluzioni intelligenti per la creazione di validatori personalizzati che possono essere astratti per nitidezza e riutilizzo.Convalida osservabileArray contro una condizione
Nel jsfiddle di seguito, ho appena creato un modello genitore semplice che memorizza e una serie di misure (solo un valore e una data). In questo esempio, ho inserito due requisiti.
- Ogni misura ha entrambi i campi forniti o nessuno dei due deve essere fornito.
Deve esserci almeno una misura valida (soddisfa la condizione precedente) nell'array padre.
Idealmente, voglio la logica di validazione per ciò che definisce essere valido, memorizzato all'interno dell'oggetto Measurement come ho fatto di seguito. Ma, la cosa di cui sono molto dispiaciuto è la convalida "hands-on" che devo eseguire nel modello principale in
atLeastOne()
.
convalida Knockout convaliderà automaticamente i campi individuali per numeri e le date MA, devo intervenire e eseguire la convalida contro la regola per l'array.
Domanda: Sono le eventuali approcci che mi permettono di impostare la convalida KO per verificare la matrice per questo la condizione richiesta, pur avendo il metodo HasValues
ancora risiedono nel Modello Misura ??? Vale a dire, voglio astrarre il concetto di cercare "almeno uno" in un validatore personalizzato di qualche tipo che possa gestire il lavoro per me, e poi dire semplicemente questo validatore "hey, ecco la funzione che voglio che tu usi per convalidare ogni elemento nell'array. "
Grazie in anticipo!
function Model(data)
{
var self = this;
self.Measurements = ko.observableArray();
for(var i = 0; i < data.length; i++)
self.Measurements.push(new Measurement(data[i]));
function hasAtLeastOne(){
var atLeastOne = false;
$.each(self.Measurements(), function(i, item) {
if (item.HasValues()) {
atLeastOne = true;
return;
}
});
return atLeastOne;
}
self.Save = function() {
if (self.canSave() && atLeastOne())
alert('save');
else
alert('arg!');
};
self.errors = ko.validation.group(self);
self.canSave = ko.computed(function() {
return self.errors().length == 0;
});
}
function Measurement(data)
{
var self = this;
self.Value = ko.observable(data.val);
self.Date = ko.observable(data.date);
self.Value.extend({ required: { onlyIf: isRequired }, number: true });
self.Date.extend({ required: { onlyIf: isRequired }, date: true });
self.HasValues = function() {
return ko.utils.isNotNullUndefOrEmpty(self.Value()) &&
self.Date() && self.Date().length > 0;
};
function isRequired() {
return ko.utils.isNotNullUndefOrEmpty(self.Value()) ||
(self.Date() && self.Date().length > 0);
}
}
ko.utils.isNotNullUndefOrEmpty = function (value) {
return (typeof value === 'string' && value.length > 0) ||
(typeof value !== 'string' && value);
};
Ecco un jsfiddle per giocare con che ha il mio esempio: http://jsfiddle.net/cACZ9/