Validation 动态淘汰验证未显示错误消息
我的视图模型上有一个属性,它只需要在某些条件下进行验证 从某种意义上说,当我检查控制台中的viewModel.errors()时,它会向我显示其中的错误,但是消息永远不会显示在页面上。如果我首先扩展我的observable,它就会工作,但是如果我删除验证并将其放回,它将不再在页面上显示错误消息 在下面的示例中,如果加载代码/jsfiddle,单击“EnableRequired”按钮,然后单击“ShowErrors”,您将看到它正确抛出错误,但不会显示错误消息。我尝试过使用customMessageTemplate和不使用customMessageTemplate(不过我的live工具使用customMessageTemplate) 这个JSFIDLE还有一件事我的live工具没有做,那就是在尝试禁用必需状态时抛出一个错误,不太清楚为什么要这样做。并且,Validation 动态淘汰验证未显示错误消息,validation,knockout.js,knockout-validation,Validation,Knockout.js,Knockout Validation,我的视图模型上有一个属性,它只需要在某些条件下进行验证 从某种意义上说,当我检查控制台中的viewModel.errors()时,它会向我显示其中的错误,但是消息永远不会显示在页面上。如果我首先扩展我的observable,它就会工作,但是如果我删除验证并将其放回,它将不再在页面上显示错误消息 在下面的示例中,如果加载代码/jsfiddle,单击“EnableRequired”按钮,然后单击“ShowErrors”,您将看到它正确抛出错误,但不会显示错误消息。我尝试过使用customMessag
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验证仍处于半中断状态,只有在他们愿意的情况下才会弹出消息。