我有一个表单,其中包含一些字段和一个项目列表,用户可以向其中添加项目。要使表单有效,表单上的所有字段和列表中的所有项目都必须有效。向列表中添加新项目时,该项目将无效,因为所有必填字段都将为空。
不幸的是,敲除验证似乎没有看到这一点,并报告表单有效。列表项中的各个字段将独立验证,并显示“此字段是必需的。”消息,但包含所有内容的validatedObservable报告为有效()为true。更奇怪的是,如果我通过编辑列表添加之前存在的某个字段而使表单无效,突然间一切都开始正常工作了。
下面是我正在处理的问题的一个示例:http://jsfiddle.net/97Lr15zq/5/
ko.validation.init({
registerExtenders: true,
messagesOnModified: true,
insertMessages: true,
parseInputAttributes: true,
messageTemplate: null,
grouping: {
deep: true,
live: true
}
},
true);
var viewModel = {
items: ko.observableArray([]),
test: ko.observable('e').extend({ required: true }),
add: function(){
viewModel.items.push({
firstName: ko.observable('').extend({ required: true }),
lastName: ko.observable('').extend({ required: true })
});
},
submit: function() {
if (viewModel.errors.isValid()) {
alert('Thank you.');
}
else {
alert('Please check your submission. Errors: ' + viewModel.errors.errors().length);
viewModel.errors.errors.showAllMessages();
}
}
};
viewModel.errors = ko.validatedObservable({items: viewModel.items, test: viewModel.test});
ko.applyBindings(viewModel);
如何让敲除验证在新列表项添加后立即开始监视它们?
1条答案
按热度按时间ymzxtsji1#
这并不理想,我仍然希望找到一个更干净的解决方案,但现在我所做的是向viewModel和validatedObservable添加一个observable,它的唯一目的是使其无效,以便knockout-validate开始拾取新列表项中的更改。
http://jsfiddle.net/97Lr15zq/6/
var viewModel = { items: ko.observableArray([]), test: ko.observable('e').extend({ required: true }),**invalidator: ko.observable('a').extend({ required: true }),**add: function(){ viewModel.items.push({ firstName: ko.observable('').extend({ required: true }), lastName: ko.observable('').extend({ required: true }) });**viewModel.invalidator(''); viewModel.invalidator('a');**}, submit: function() { if (viewModel.errors.isValid()) { alert('Thank you.'); } else { alert('Please check your submission. Errors: ' + viewModel.errors.errors().length); viewModel.errors.errors.showAllMessages(); } } };
``个
viewModel.errors = ko.validatedObservable({ items: viewModel.items, test: viewModel.test,**invalidator: viewModel.invalidator**});