Knockout Validation会在加载时立即评估

时间:2012-12-03 20:27:04

标签: validation knockout.js knockout-validation

我正在使用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>

As displayed on my local machine

3 个答案:

答案 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事件,因此没有验证。