Knockoutjs立即验证

问题描述:

我创建了一个使用AMD的knockoutjs应用程序。目前我有点坚持验证。这里的视图模型代码:Knockoutjs立即验证

define(['knockout', 'hasher', 'text!./login-window.html'], 
    function (ko, hasher, templateMarkup) { 
    'use strict'; 

    function LoginWindowViewModel(params) { 
     //observables 
     this.properties = ko.validatedObservable({ 
      username: ko.observable().extend({ 
       required: { message: 'Please supply your user name' } 
      }), 
      password: ko.observable().extend({ 
       required: { message: 'Please supply your password' } 
      }) 
     }); 
    } 

    return { viewModel: LoginWindowViewModel, template: templateMarkup }; 

}); 

<div data-bind="css: { 'form-group': true, 'has-error': !properties().username.isValid() }"> 
    <label for="input-username" class="col-lg-3 control-label">Username</label> 
    <div class="col-lg-9"> 
     <input type="text" name="input-username" class="form-control" data-bind="value: properties().username" /> 
    </div> 
</div> 
<div data-bind="css: { 'form-group': true, 'has-error': !properties().password.isValid() }"> 
    <label for="input-password" class="col-lg-3 control-label">Password</label> 
    <div class="col-lg-9"> 
     <input type="text" name="input-password" class="form-control" data-bind="value: properties().password" /> 
    </div> 
</div> 

的问题是,网页上加载淘汰赛增加has-errors类的“包装申报单”(那些form-group类)。如何在用户将某些东西输入到绑定输入后打开验证?

在你点这里之前:Knockout Validation evaluates immediately on load - 我没有验证信息出现问题,但是div添加了一个当前不应该有的类。

试试这个在绑定:

css: { 'form-group': true, 'has-error': !properties().username.isValid() && properties().username.isModified() } 

基本上我们检查,如果观察到已被修改,出现错误。 isModified是由ko验证自动插入的可观察项。

如果事情在你的视图模型实际上是设置可观察到空或空,(例如一些初始化代码),然后你需要:

properties().username.isModified(false) 

我没有测试过它,所以它可能需要一些调整

+0

这就是我正在寻找的代码,谢谢! –

我想出了一个临时解决方案,但我不喜欢它,所以任何人有更好的主意 - 请出面:)。

this.shouldValidateUsername = ko.pureComputed(function() { 
    return !this.properties().username.isValid() && this.validationIsOn(); 
}, this); 
this.shouldValidatePassword = ko.pureComputed(function() { 
    return !this.properties().password.isValid() && this.validationIsOn(); 
}, this); 

和HTML的有趣的部分是:

<div data-bind="css: { 'form-group': true, 'has-error': shouldValidateUsername() }">(...) 

我切换validationIsOn观察到这样打开的验证和关闭。

+0

如果你只是想影响显示,怎么样:添加一个'css:{showValidation:hasBeenSubmitted}'绑定到你的表单。第一次提交表单后,将'hasBeenSubmitted'观察值设置为true。像这样'.showValidation .has-error {...}'定义你的CSS。这样'.has-error'在页面加载时不起作用。您不必在主视图模型上添加任何自定义逻辑和只有一个额外的可观察值。例如,你当然可以实现'hasBeenModified'可观察值而不是'hasBeenSubmitted'。 – Tomalak