Validation viewmodel组件上的KnockoutJS验证插件

Validation viewmodel组件上的KnockoutJS验证插件,validation,knockout.js,Validation,Knockout.js,我的viewmodel有一个存储对话框状态对象的ko.observable成员。每个对话框对象都有与对话框中的输入字段对应的各种成员。我想使用KnockoutJS验证插件将验证添加到对话框中 但是,我不想将验证添加到整个视图模型中,而只是添加到对话框中。当我尝试像这样扩展对话框时: this.dialog = ko.observable(new RegistrationDialog(self)).extend({validatable: true}); 工作不正常:没有定义isVali

我的viewmodel有一个存储对话框状态对象的
ko.observable
成员。每个对话框对象都有与对话框中的输入字段对应的各种成员。我想使用KnockoutJS验证插件将验证添加到对话框中

但是,我不想将验证添加到整个视图模型中,而只是添加到对话框中。当我尝试像这样扩展对话框时:

    this.dialog = ko.observable(new RegistrationDialog(self)).extend({validatable: true});

工作不正常:没有定义isValid()和errors()方法,验证工作不正常。我创建了一个示例来说明这一点。当我按下开始按钮时,对话框打开(请原谅没有CSS),但按下enter键不会生成任何错误消息。电子邮件验证也无法工作,显示消息“true不是正确的电子邮件地址”。

以下是一个工作版本:

我在其中添加了一个错误组,并在允许您的注册方法成功之前对其进行检查,否则我将显示错误。

我将使用以下选项:

然后修复小提琴中的一些错误:

  • 数据盲
  • 单击表单上的处理程序(我假设不是提交)
  • 在注册按钮上有
    enable:isValid
    ,它应该是
    enable:isValid()
    (由于修复了表单提交绑定,我还删除了点击绑定)

我想就是这样

如果希望isValid工作,请将其添加到RegistrationDialog:this.isValid=ko.computed(函数(){return self.errors().length==0;});很抱歉,我的示例中出现了拼写错误;这是一项相当仓促的剪贴工作。您提供的示例比我的好得多,但它仍然显示用于电子邮件验证的奇怪错误消息,并且如果我在按钮上实现
enable
绑定,则不会处理enter键。新的例子包括@antishok的有用建议。我之前尝试过
ko.validatedObservable
,但当时不起作用。不知道我搞砸了什么!电子邮件问题是一个已知的错误。对于快速解决方法,您可以使用以下内容:email:'this'(而不是email:true)。它的计算结果仍然为true,因此验证将运行,并且“This”将添加到错误中,并显示“This not a valid email address”消息哦对于输入键处理,我发现自定义绑定很有用。您能解释一下为什么在空对话框中按输入键不会触发任何验证吗?我对此也有问题。验证插件似乎没有任何内置的表单和提交支持。我只是稍微修改了一下,添加了一个隐藏的提交按钮(当没有启用提交按钮时,按enter键并没有尝试提交表单…)。这是小提琴:好的,这是个好主意!关于为什么电子邮件错误消息将
true
报告为电子邮件地址,您有什么想法吗?正如John所说,这是验证插件的一个错误,我同意他使用
电子邮件的解决方法:“this”
this.dialog = ko.validatedObservable(new RegistrationDialog(this));