Próbuję eksperymentować i sprawdzać, czy istnieją sprytne rozwiązania do tworzenia niestandardowych weryfikatorów, które można wyodrębnić ze zgrabności i ponownego użycia.Sprawdzanie poprawności obiektu obserwowalnego względem warunku.
W poniższym jsfiddle po prostu ułożyłem prosty model macierzysty, który przechowuje i zawiera tablicę pomiarów (tylko wartość i data). W tym przykładzie wprowadziłem dwa wymagania.
- Każdy pomiar zawiera oba pola lub nie trzeba ich dostarczać.
Musi być co najmniej jeden prawidłowy (spełnia poprzedni warunek) pomiar w macierzy nadrzędnej.
Idealnie, chcę logiki sprawdzania poprawności dla tego, co określa się jako ważne, przechowywane w obiekcie Measurement, jak to zrobiłem poniżej. Ale rzeczą, z której jestem bardzo niesmaczny, jest "ręczna" walidacja, którą muszę wykonać w modelu nadrzędnym w
atLeastOne()
.
walidacja Knockout automatycznie zweryfikować poszczególne pola dla liczb i dat ale muszę wkroczyć i sprawdzania poprawności przeciwko władzy na tablicy.
Pytanie: Czy jakieś metody, które pozwalają mi setup walidacji KO sprawdzić tablicę dla tego wymaganego warunku nadal mając metoda HasValues
nadal mieszkają w modelu pomiaru ??? Tj. Chcę streścić koncepcję wyszukiwania "co najmniej jednego" w niestandardowym walidatorze, który może obsłużyć to zadanie dla mnie, a następnie po prostu powiedzieć temu walidatorowi "hej, oto funkcja, którą chcę, abyś użył do sprawdzenia poprawności każdy element w tablicy. "
Z góry dziękuję!
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);
};
Oto jsfiddle do zabawy, która ma moim przykładem: http://jsfiddle.net/cACZ9/