我的视图模型中有一个属性,只需要在某些条件下进行验证。
它的工作正常,当我检查控制台的viewModel.errors()时,它会向我显示错误,但是消息永远不会出现在页面上。如果我将observable扩展为开头,它会起作用,但是如果我删除了验证并将其重新放回,则不再在页面上显示错误消息。
在下面的示例中,如果您加载代码/ jsfiddle,请单击"启用必需"按钮然后打开"显示错误"你会看到它正确地抛出错误,但不会显示错误信息。我已经尝试过使用和不使用customMessageTemplate(我的实时工具使用了customMessageTemplate)。
这个jsfiddle还有一点就是我的实时工具在尝试禁用所需状态时不会抛出错误,不太确定它为什么会这样做。并且self.errors
字段不会填充错误,但具有在我的任何其他验证模型中都不会发生的功能。
以下代码与我的实时构建之间唯一的主要区别是使用ko.computed属性来更新我的self.features
是否需要验证,而不是使用函数,但最终结果是相同的。
这是我jsfiddle的问题。
以下是代码:
<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);
答案 0 :(得分:2)
嗯..在尝试了2个小时之后,我决定做这个帖子......当然,提交后5分钟我最终搞清楚了......
请注意,尝试启用/禁用验证应该有效,我还没有弄清楚为什么消息没有显示出来。但无论如何,这都是一个更加简单和优雅的解决方案:
由于我的验证是基于另一个属性是否有值,我可以使用ko验证的onlyIf
选项:
self.feature = ko.observable().extend({
required: {
message: 'please select a feature',
onlyIf: function () {
return self.propertyToCheckFor() == true;
}
}
});
如果在observable上进行检查并且验证错误消息显示正常,则启用/禁用动态验证!