2012-03-09 127 views
1

您好我是Knockoutjs的新手,我想发布一个表单,例如我有一个电子邮件地址,需要电子邮件地址需要独特。Knockoutjs验证和服务器验证

在我检查,如果电子邮件地址是唯一的或不是,然后服务器返回一个validationjson类例如

{ isEmailUnique:假的, isPasswordStrongEnough:真实的; }

如何用knockoutjs验证以一种整洁的方式显示这些错误?

回答

4

我会为此使用两个不同的服务器端验证程序,因为它们会影响视图模型中的不同观察值。

knockout validation readme

ko.validation.rules['isEmailUnique'] = { 
    validator: function(val, param){ 
     var isValid = true; 

     $.ajax({ 
      async: false, 
      url: '/validation/isEmailUnique', 
      type: 'POST', 
      data: { value: val, param: param }, 
      success: function(response){ 
       isValid = response === true;    
      }, 
      error: function(){ 
       isValid = false; //however you would like to handle this    
      } 
     }); 

     return isValid; 
    }, 
    message: 'The Email is not unique' 
};    

最初采取然后,你需要创建一个接受,你执行你的查找POST请求的端点,然后返回true或false根据查询结果在服务器上。

使用上述验证

this.email = ko.observable() 
    .extend({ 
     isEmailUnique: { 
     message: 'Something else perhaps? It will override the message in the validator' 
     } 
    }); 

您可以使用同样的事情对密码强度验证。

使用像这样的验证器会在observable发生变化时触发验证,这可能是验证的有用方法。

+0

我在他们的自述文件中看到了这篇文章,但我真的很想在一次调用中提交所有服务器端验证。如果注册无误,返回成功,否则返回错误的东西。 – NPehrsson 2012-03-09 10:06:18

+1

在这种情况下,您应该根本不应该使用验证插件来处理该特定情况。只需发布要保存的数据并照顾结果。如果您想要将错误消息放置在导致错误的字段旁边,则必须为此找出一个约定。也许一些计算可观测值可以过滤验证JSON或者你可以绑定的东西。但是,Knockout验证无法帮助您。 – 2012-03-09 10:31:44

+0

:(okeay,我想根据需要使用其他的东西等,所以当我从服务器收到结果时,没有办法“触发”验证错误? – NPehrsson 2012-03-09 10:37:37

2

我有点晚,但对于我的2美分价值,我会采取更通用的方法,例如从服务器端点(如/ Register)返回标准JSON序列化的AjaxResult类,并使用Data(例如,用于更新模型的任意容器,以便与映射插件重新绑定)以及验证消息字符串的集合等。然后,您可以拥有绑定到ObservableArray和push/map的HTML验证摘要来自您的Ajax的消息导致到那里。这基本上是我用Knockout所做的,它很好地工作。