【问题标题】:Knockout Validation evaluates immediately on load淘汰赛验证在加载时立即评估
【发布时间】:2012-11-21 09:11:04
【问题描述】:

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

【问题讨论】:

    标签: validation knockout.js knockout-validation


    【解决方案1】:

    在为视图模型应用绑定之后。然后为该视图模型将showAllMessages 设为false

    示例

    YourViewmodelname.errors.showAllMessages(false);
    

    【讨论】:

    • 在我的情况下有用的语法略有不同:ko.validation.group(viewModel()).showAllMessages(false);
    • @JonathanStrate 感谢您发布该消息-在我的情况下 viewmodel.errors 未定义,您的版本有效。
    • 在ko.applyBindings(...)之后,将错误分组并调用方法:ko.validation.group(yourViewModel, { deep: true }).showAllMessages(false);
    【解决方案2】:

    引用 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"}
    });
    

    希望这会有所帮助...

    【讨论】:

      【解决方案3】:

      我自己解决了这个问题。

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

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

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

      【讨论】:

      • 我将模型设置为空字符串,但它仍然在加载时触发。我注意到的一件事是 optionsCaptions: 'Select...' 确实放入了项目,但值不是 value="" 它只是
      猜你喜欢
      • 2014-11-04
      • 1970-01-01
      • 2012-02-18
      • 2015-06-05
      • 2014-01-12
      • 2011-08-09
      • 2015-09-28
      • 2012-11-04
      • 1970-01-01
      相关资源
      最近更新 更多