我正在使用MVC,Knockout和Knockout Validation来验证我的视图模型。
我遇到了一个问题,即加载时视图模型属性的验证会立即触发。换句话说,在用户尝试更改其值之前,“我需要此字段”显示在我的输入旁边。
此问题特别发生在下拉列表(选择)控件上。
我猜这是我通过某种方式无意中更改/访问/改变我的javascript代码的另一部分中的observable而创建的问题。但是,我不知道如何追踪它。
有没有办法可以以某种方式订阅或跟踪导致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>
答案 0 :(得分:21)
应用viewmodel的绑定后。然后,对于该视图模型,将showAllMessages
设为false
示例强>
YourViewmodelname.errors.showAllMessages(false);
答案 1 :(得分:9)
引用KO页面....(http://knockoutjs.com/documentation/options-binding.html)
KO将在项目列表的前面加上一个显示“选择项目...”文本的项目,并且值为undefined。因此,如果myChosenValue保持未定义的值(默认情况下可观察到的值),则将选择虚拟选项。如果optionsCaption参数是可观察的,那么初始项目的文本将随着可观察值的变化而更新。
所以,我通过设置&#34; undefined&#34;来解决它。在定义属性时,请参见下面的示例:
self.myProperty = ko.observable(undefined).extend({
required : {"Field Required"}
});
希望这会有所帮助......
答案 2 :(得分:8)
我自己想出了这个问题。
剃刀引擎模板化选择选项之间存在问题,然后将所选元素的值绑定到Knockout。
尽管选择框中没有用户输入的值,但默认值为&#34; - 选择 - &#34;实际上包含一个值。在我的情况下,它是一个空字符串。因此,当我应用敲除绑定时,我的viewmodel属性被更新&#34;使用空字符串值,因此验证已触发。
为了解决这个问题,我将模型的默认值设置为空字符串。因此,当应用绑定时,在Knockout observable上没有触发valueHasMutated事件,因此没有验证。