Knockout Validation会在加载时立即评估

let*_*lly 20 validation knockout.js knockout-validation

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

我遇到了一个问题,即视图模型属性的验证在加载时立即触发.换句话说,在用户尝试更改其值之前,"我需要此字段"显示在我的输入旁边.

下拉(选择)控件特别发生此问题.

我猜这是我通过某种方式无意中更改/访问/改变我的javascript代码的另一部分中的observable而创建的问题.但是,我不知道如何追踪这一点.

有没有办法,我可以以某种方式订阅或跟踪甚至导致Knockout验证中的验证的火灾?我只需要知道为什么它会以它的方式发射.我非常确信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>
Run Code Online (Sandbox Code Playgroud)

显示在我的本地计算机上

小智 21

在为viewmodel应用绑定之后.然后为该视图模型制作showAllMessagesfalse

YourViewmodelname.errors.showAllMessages(false);
Run Code Online (Sandbox Code Playgroud)

  • 在我的情况下有用的语法略有不同:`ko.validation.group(viewModel()).showAllMessages(false);` (6认同)

小智 10

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

KO将在项目列表的前面加上一个显示"选择项目..."文本的项目,并且值为undefined.因此,如果myChosenValue保持未定义的值(默认情况下可观察到的值),则将选择虚拟选项.如果optionsCaption参数是可观察的,则初始项的文本将随着observable的值更改而更新.

所以,我在定义属性时通过设置"undefined"来解决它,参见下面的示例:

self.myProperty = ko.observable(undefined).extend({
    required :  {"Field Required"}
});
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助...


let*_*lly 8

我自己想出了这个问题.

剃刀引擎模板化选择选项之间存在问题,然后将所选元素的值绑定到Knockout.

尽管选择框中没有用户输入的值,但默认值"--select--"实际上包含一个值.在我的情况下,它是一个空字符串.因此,当我应用knockout绑定时,我的viewmodel属性被"更新"了空字符串值,因此验证被触发.

为了解决这个问题,我将模型的默认值设置为空字符串.因此,当应用绑定时,在Knockout observable上没有触发valueHasMutated事件,因此没有验证.