knockout.js 如何通过Knockout-Validation向observableArray添加无效项来使validatedObservable无效

vs3odd8k  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(118)

我有一个表单,其中包含一些字段和一个项目列表,用户可以向其中添加项目。要使表单有效,表单上的所有字段和列表中的所有项目都必须有效。向列表中添加新项目时,该项目将无效,因为所有必填字段都将为空。
不幸的是,敲除验证似乎没有看到这一点,并报告表单有效。列表项中的各个字段将独立验证,并显示“此字段是必需的。”消息,但包含所有内容的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);

如何让敲除验证在新列表项添加后立即开始监视它们?

ymzxtsji

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**});

相关问题