Tôi đang cố gắng thử nghiệm và xem liệu có bất kỳ giải pháp thông minh nào để tạo trình xác thực tùy chỉnh có thể được tóm tắt để gọn gàng và sử dụng lại hay không.Xác nhận quan sátArray chống lại một điều kiện
Trong jsfiddle bên dưới, tôi chỉ cần đặt cùng một mô hình cha mẹ đơn giản lưu trữ và mảng các phép đo (chỉ là giá trị và ngày). Trong ví dụ này, tôi đưa ra hai yêu cầu.
- Mỗi phép đo có cả hai trường được cung cấp hoặc không được cung cấp.
Phải có ít nhất một giá trị hợp lệ (đáp ứng điều kiện trước) trong mảng mẹ.
Lý tưởng nhất, tôi muốn logic xác thực cho những gì xác định là hợp lệ, được lưu trữ trong đối tượng Đo lường như tôi đã thực hiện bên dưới. Nhưng, điều tôi rất bực mình là xác nhận "thực hành" mà tôi phải thực hiện trong mô hình gốc trong
atLeastOne()
.
Xác nhận loại bỏ sẽ tự động xác thực trường riêng cho số và ngày NHƯNG, tôi phải bước vào và thực hiện xác thực đối với quy tắc cho mảng.
Câu hỏi: Có bất kỳ phương pháp nào cho phép tôi thiết lập tính hợp lệ KO để kiểm tra mảng cho điều kiện yêu cầu này trong khi vẫn có phương thức HasValues
vẫn còn trong Mô hình đo không ??? Tức là tôi muốn trừu tượng khái niệm tìm kiếm "ít nhất một" thành trình xác thực tùy chỉnh của một số loại có thể xử lý công việc cho tôi, và sau đó chỉ cần nói cho trình xác nhận này "hey, đây là hàm tôi muốn bạn sử dụng để xác thực mỗi mục trong mảng. "
Cảm ơn trước!
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);
};
Đây là một jsfiddle để chơi với điều đó có ví dụ của tôi: http://jsfiddle.net/cACZ9/