我有一个表单,其中包含一些字段和一个用户可以添加到的项目列表。 要使表单有效,表单上和列表中所有项目中的所有字段都必须有效。 将新项目添加到列表时,它将无效,因为所有必填字段都将为空。
不幸的是,挖空验证似乎没有看到这一点,并将表单报告为有效。 列表项中的各个字段将独立验证并显示"此字段是必需的"消息,但包含所有内容的 validatedObservable 将 isValid(( 标记为 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);
如何获得挖空验证,以便在添加新列表项后立即开始监视它们?
这并不理想,我仍然希望找到一个更干净的解决方案,但现在我最终所做的是向 viewModel 添加一个可观察量和 validatedObservable,其唯一目的是无效,以便 KNOCKOUT 验证将开始获取新列表项中的更改。
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 });