下拉列表中的Knockout Validation始终显示错误消息

Chr*_*lls 5 javascript knockout-2.0 knockout.js knockout-validation

将值绑定到下拉列表并使用敲除验证时,即使我的敲除验证设置说明,也会始终显示错误消息messagesOnModified: true.

HTML

<input type="text" data-bind="value: Name" />
<br />
<select data-bind="value: State">
    <option value="">Select a state...</option>
    <option value="NY">New York</option>
    <option value="NJ">New Jersey</option>
</select>
Run Code Online (Sandbox Code Playgroud)

JS

var ViewModel = function () {
     var self = this;

    self.Name = ko.observable().extend({
        required: { message: "You must enter a name." }
    });
    self.State = ko.observable().extend({
        required: { message: "You must select a state." }
    });

    self.Errors = ko.validation.group(self);
}

ko.validation.configure({
    messagesOnModified: true,
    insertMessages: true
});

ko.applyBindings(new ViewModel(), document.body);
Run Code Online (Sandbox Code Playgroud)

并且jsfiddle显示文本框和下拉列表之间的区别:http://jsfiddle.net/f7v4m/

文本框显示正确的行为,错误消息仅在修改值后显示.

为什么显示下拉列表的错误消息?

nem*_*esv 12

要删除"initlial"验证消息,您需要State使用空字符串初始化属性:

self.State = ko.observable("").extend({
    required: { message: "You must select a state." }
});
Run Code Online (Sandbox Code Playgroud)

演示JSFiddle.

您需要执行此操作,因为在编写 ko.observable()时将初始化,undefined但是当knockout评估value绑定时,它将设置State为当前选定的空选项值,即空字符串.

但是,undefined它不等于空字符串,它会使您的属性"脏"并触发验证消息,因为验证插件认为您的属性已被修改.

  • 找到了`optionsCaption`绑定的解决方案.你需要将observable初始化为`undefined`,如下所示:`ko.observable(undefined).extend({..});`http://jsfiddle.net/7UzH9/13/ (4认同)
  • 与 `options` 和 `optionsCaption` 绑定结合使用时不起作用。http://jsfiddle.net/7UzH9/12/ (2认同)