Validation 动态淘汰验证未显示错误消息

Validation 动态淘汰验证未显示错误消息,validation,knockout.js,knockout-validation,Validation,Knockout.js,Knockout Validation,我的视图模型上有一个属性,它只需要在某些条件下进行验证 从某种意义上说,当我检查控制台中的viewModel.errors()时,它会向我显示其中的错误,但是消息永远不会显示在页面上。如果我首先扩展我的observable,它就会工作,但是如果我删除验证并将其放回,它将不再在页面上显示错误消息 在下面的示例中,如果加载代码/jsfiddle,单击“EnableRequired”按钮,然后单击“ShowErrors”,您将看到它正确抛出错误,但不会显示错误消息。我尝试过使用customMessag

我的视图模型上有一个属性,它只需要在某些条件下进行验证

从某种意义上说,当我检查控制台中的viewModel.errors()时,它会向我显示其中的错误,但是消息永远不会显示在页面上。如果我首先扩展我的observable,它就会工作,但是如果我删除验证并将其放回,它将不再在页面上显示错误消息

在下面的示例中,如果加载代码/jsfiddle,单击“EnableRequired”按钮,然后单击“ShowErrors”,您将看到它正确抛出错误,但不会显示错误消息。我尝试过使用customMessageTemplate和不使用customMessageTemplate(不过我的live工具使用customMessageTemplate)

这个JSFIDLE还有一件事我的live工具没有做,那就是在尝试禁用必需状态时抛出一个错误,不太清楚为什么要这样做。并且,
self.errors
字段没有填充错误,而是使用了一个在我的任何其他验证模型中都不会发生的函数

下面的代码和我的live build之间唯一的主要区别是使用ko.computed属性来更新我的
self.features
是否需要验证,而不是使用函数,但最终结果是相同的

这是我的问题的一部分

下面是代码:

<div id='container'>
    <select data-bind="value: feature, options: features, optionsCaption: 'Select'"></select>

    <br/>

    <button data-bind='click: attachRequired'>Enable Required</button>
    <button data-bind='click: removeRequired'>Disable Required</button>
    <button data-bind='click: showMessages'>Show errors</button>

</div>

<script id="customMessageTemplate" type="text/html">
    <em class="customMessage" data-bind='validationMessage: field'></em>
</script>

ko.validation.configure({
    //decorateElement: true,
    registerExtenders: true,
    messagesOnModified: true,
    insertMessages: true,
    parseInputAttributes: true,
    messageTemplate: 'customMessageTemplate'
});


function viewModel(){
    var self = this;

     self.errors = ko.validation.group(self, {
        deep: false,
        observable: false
    });

    self.feature = ko.observable();
    self.feature.subscribe(function () {
        alert(self.feature());
    })
    self.features = ["test1", "test2", "test3"];

    self.attachRequired = function () {
        self.feature.extend({
            required: {
                message: 'please select a feature'
            }
        })  
    };

    self.removeRequired = function () {
        self.feature.extend({ validatable: false });
    };

    self.showMessages = function () {
        self.errors.showAllMessages();
        alert(self.errors().length ? "error" : "no errors");
    };
}


var model = new viewModel();

ko.applyBindings(model);


启用必需的 禁用必需的 显示错误 ko.validation.configure({ //装饰元素:是的, registerExtenders:对, messages:true, insertMessages:true, ParseInputAttribute:true, messageTemplate:'customMessageTemplate' }); 函数viewModel(){ var self=这个; self.errors=ko.validation.group(self{ 深:错, 可观察的:假 }); self.feature=ko.observable(); self.feature.subscribe(函数(){ 警报(self.feature()); }) self.features=[“test1”、“test2”、“test3”]; self.attacherrequired=函数(){ self.feature.extend({ 所需:{ 消息:“请选择一项功能” } }) }; self.removeRequired=函数(){ extend({validable:false}); }; self.showMessages=函数(){ self.errors.showAllMessages(); 警报(self.errors().length?“error”:“无错误”); }; } var模型=新的viewModel(); ko.应用绑定(模型);
好吧。。经过两个小时的努力,我决定写这篇文章。。。当然,在提交5分钟后,我终于弄明白了

我只想尝试启用/禁用验证应该会起作用,但我还不太明白为什么消息没有显示出来。但无论如何,有一个更简单、更优雅的解决方案:

由于我的验证基于另一个属性是否具有值,因此我可以使用ko验证的
onlyIf
选项:

self.feature = ko.observable().extend({
    required: {
        message: 'please select a feature',
        onlyIf: function () {
            return self.propertyToCheckFor() == true;
        }
    }
});

如果检查是在一个可观察对象上完成的,并且验证错误消息显示得很好,那么这将启用/禁用动态验证

即使到了2015年的一半,ko验证仍处于半中断状态,只有在他们愿意的情况下才会弹出消息。