21

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

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

这个问题特别发生在下拉(选择)控件上。

我猜这是我通过在我的 javascript 代码的另一部分中以某种方式无意更改/访问/变异 observable 造成的问题。但是,我不知道如何追踪这一点。

有没有一种方法可以让我以某种方式订阅或跟踪导致 Knockout Validation 中验证的触发事件?我只需要知道为什么会这样。我非常有信心 isValid() 函数的值始终是错误的。

这是我的 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>

显示在我的本地机器上

4

3 回答 3

21

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

例子

YourViewmodelname.errors.showAllMessages(false);
于 2013-11-06T09:42:42.660 回答
11

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

KO 将在项目列表前面加上一个显示文本“选择一个项目...”并且其值未定义的项目。因此,如果 myChosenValue 的值是 undefined(默认情况下 observables 会这样做),那么将选择 dummy 选项。如果 optionsCaption 参数是一个 observable,那么初始项的文本将随着 observable 值的变化而更新。

因此,我通过在定义属性时设置“未定义”来解决它,请参见下面的示例:

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

希望这可以帮助...

于 2013-05-22T12:39:04.513 回答
9

我自己想出了这个问题。

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

尽管选择框中没有用户输入的值,但默认值“--select--”实际上包含一个值。就我而言,它是一个空字符串。因此,当我应用淘汰绑定时,我的 viewmodel 属性被“更新”为空字符串值,因此触发了验证。

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

于 2012-12-04T00:42:41.387 回答