动态Knockout验证未显示错误消息

时间:2014-07-01 18:54:00

标签: validation knockout.js knockout-validation

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

它的工作正常,当我检查控制台的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);

1 个答案:

答案 0 :(得分:2)

嗯..在尝试了2个小时之后,我决定做这个帖子......当然,提交后5分钟我最终搞清楚了......

请注意,尝试启用/禁用验证应该有效,我还没有弄清楚为什么消息没有显示出来。但无论如何,这都是一个更加简单和优雅的解决方案:

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

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

如果在observable上进行检查并且验证错误消息显示正常,则启用/禁用动态验证!