如何使用 Knockout-Validation 将无效项目添加到 observableArray 以使 validObservable 无效

Posted

技术标签:

【中文标题】如何使用 Knockout-Validation 将无效项目添加到 observableArray 以使 validObservable 无效【英文标题】:How can I cause adding an invalid item to an observableArray to invalidate the validatedObservable with Knockout-Validation 【发布时间】:2020-03-19 01:09:17 【问题描述】:

我有一个表单,其中包含一些字段和用户可以添加的项目列表。要使表单有效,表单上的所有字段以及列表的所有项目中的所有字段都必须有效。当新项目添加到列表中时,它将无效,因为所有必填字段都将为空白。

不幸的是,淘汰赛验证似乎没有看到这一点,并将表单报告为有效。列表项中的各个字段将独立验证并显示“此字段为必填项”。消息,但包含所有内容的 validateObservable 将 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);

如何获得淘汰验证以在添加新列表项后立即开始监控它们?

【问题讨论】:

【参考方案1】:

这并不理想,我仍然希望找到一个更清洁的解决方案,但现在我最终做的是向 viewModel 和 validObservable 添加一个 observable,其唯一目的是使其失效,以便淘汰验证将开始获取新列表项中的更改。

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( 项目:viewModel.items, 测试:viewModel.test, invalidator:viewModel.invalidator );

【讨论】:

以上是关于如何使用 Knockout-Validation 将无效项目添加到 observableArray 以使 validObservable 无效的主要内容,如果未能解决你的问题,请参考以下文章

自定义react数据验证组件

淘汰赛验证多个自定义异步规则

[精选] Mysql分表与分库如何拆分,如何设计,如何使用

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]