Knockout验证在加载时立即进行评估。

21

我正在使用MVC、Knockout和Knockout Validation来验证我的视图模型。

我遇到了一个问题,就是在加载时视图模型的属性验证会立即触发。换句话说,在用户尝试更改值之前,“此字段为必填项”就会出现在输入框旁边。

这个问题特别出现在下拉控件(select)上。

我猜想这是我在JavaScript代码的其他部分无意中更改、访问或改变可观察对象造成的问题。但我不知道如何追踪这个问题。

有没有一种方法可以订阅或跟踪Knockout Validation中导致验证触发的事件?我只需要知道为什么会以这种方式触发。我相当自信isValid()函数的值始终为false。

以下是在页面加载时未修改的HTML示例:

<select class="highlightable validationElement" name="obsstate" data-bind="value: standardAnswers.ans106_1.value" required="true">
    <option value="">-- Select -- </option>
        <option value="AK">AK</option>
        <option value="AL">AL</option>
        etc...

</select>

在我的本地机器上显示的内容

3个回答

21

将viewmodel的绑定应用后,针对该viewmodel使showAllMessagesfalse

示例

YourViewmodelname.errors.showAllMessages(false);

6
在我的情况下有用的略微不同的语法是:ko.validation.group(viewModel()).showAllMessages(false); - Jonathan Strate
@JonathanStrate 感谢您发布这个 - 在我的情况下,viewmodel.errors 是未定义的,而您的版本起作用了。 - Peanut
在 ko.applyBindings(...) 之后,将错误分组并调用方法: ko.validation.group(yourViewModel, { deep: true }).showAllMessages(false); - goamn

11

引用KO页面.... (http://knockoutjs.com/documentation/options-binding.html)

KO将在项目列表前加上一个显示文本“选择项目...”和值为undefined的选项。因此,如果myChosenValue默认持有undefined的值(这是observable默认的值),则虚拟选项将被选中。如果optionsCaption参数是一个observable,则初始项目的文本将随着observable的值的更改而更新。

所以,我通过在定义属性时设置“undefined”来解决了这个问题,例如下面的示例:

self.myProperty = ko.observable(undefined).extend({
    required :  {"Field Required"}
});

希望这可以帮助到您...


9
我自己找到了解决这个问题的方法。
问题出在razor引擎模板化选择选项,然后再将选定元素的值绑定到Knockout上。
尽管选择框中没有用户输入的值,但默认值“--选择--”实际上包含一个值。在我的情况下,它是一个空字符串。因此,当我应用Knockout绑定时,我的视图模型属性被“更新”为一个空字符串值,因此触发了验证。
为了解决这个问题,我将我的模型的默认值设置为空字符串。因此,在应用绑定时,Knockout可观察对象上没有valueHasMutated事件被触发,因此也没有验证。

我将模型设置为空字符串,但它仍在加载时触发。我注意到的一件事是,optionsCaptions: 'Select...'确实放入了该项,但其值不是value="",而只是<option value>Select...</option>。 - jmogera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接