2015-10-20 92 views
1

我有一个视图模型,在那里我有扩展使用验证的属性。我调用ko.validation.group(self),但这不会将isValid()方法添加到视图模型。基因敲除验证isValid()不起作用

所以我得到一个isValid()未定义的错误。

这里是我的代码:

var brechtbaekelandt = brechtbaekelandt || {}; 

brechtbaekelandt.login = (function ($, jQuery, ko, undefined) { 
"use strict"; 

function LoginViewModel() { 

    var self = this; 

    self.userName = ko.observable(); 
    self.password = ko.observable(); 
    self.rememberMe = ko.observable(); 

    self.errorMessage = ko.observable(); 

    self.userName.extend({ required: { message: 'Please enter your username' } }); 
    self.password.extend({ required: { message: 'Please enter your password' } }); 

    self.errors = ko.validation.group(self); 
}; 

LoginViewModel.prototype.login = function() { 

    var self = this;  

    self.errorMessage(null); 

    alert('entering login'); 

    // self.isValid() is not a function 
    if (!self.isValid()) { 

     alert('login invalid'); 

     self.errors.showAllMessages(); 
     return; 
    } 
    else 
    { 
     alert('login valid'); 
     // do login 
    }  
}; 

function init() { 

    alert('entering init'); 

    var knockoutValidationSettings = { 
     insertMessages: false, 
     decorateElement: true, 
     decorateElementOnModified: true, 
     decorateInputElement: true, 
     //errorMessageClass: 'error', 
     //errorElementClass: 'error', 
     //errorClass: 'error', 
     errorsAsTitle: false, 
     parseInputAttributes: false, 
     messagesOnModified: true, 
     messageTemplate: null, 
     grouping: { deep: true, observable: true } 
    }; 

    ko.validation.init(knockoutValidationSettings, true); 

    var viewModel = new LoginViewModel(); 

    ko.applyBindingsWithValidation(viewModel); 
} 

return { 
    LoginViewModel: LoginViewModel, 
    init: init 
}; 

})($, jQuery, ko); 

我创建了一个JS提琴:click here

我读过的地方,你需要调用registerExtenders(),但我尝试过了,它不工作。

有人可以帮助我在正确的方向吗?谢谢!

+1

像这样的HTTP工作样品与group

工作示例://的jsfiddle .net/supercool/hu6rgjjm/7 /。让我知道' –

+0

是的,我知道这一个,我知道它的工作原理,但在文档中它说我的方法也应该工作,并且ko.validation.group(self)应该将isValid()添加到self。如果真的没有解决方案,我会明确地使用你的例子超酷!谢谢! 有人有同样的问题,但它使用ko.validation.group()解决... http://stackoverflow.com/questions/16802788/knockout-viewmodel-isvalid-error-when-using- knockout-validation-plugin –

+0

'validatedObservable'在后台调用组并在错误属性中存储,稍后我们调用showAllMessages。我从来没有尝试用'组'作为替代。 Imho你可以随着小提琴版本去,无论如何,我会试着看你在看什么。欢呼 –

回答

3

好吧,你似乎在寻找isValid当使用group强硬有一种方法(替代方式)使用length属性来实现它。由于isValid在使用组时似乎不可用(它与validatedObservable一起存在)。

由于@jeff这个答案的人提到这个话题

的ko.validation.group只是给你一个(计算机)可观察到的所有 错误消息的模型。它仅收集模型的直接属性的错误消息。

在另一方面的ko.validatedObservable不仅收集 错误消息,但也包装了模型中可观察到的和增加了一个 IsValid属性表示是否存在任何错误 消息(即,该模型是完全有效的)。否则,他们 基本相同。

我相应的修改你的代码像下面

self.errors = ko.validation.group(self); //It will group error messages in array i.e based on count you must validate 
    LoginViewModel.prototype.login = function() { 
      var self = this;  
      self.errorMessage(null); 
      //self.isValid() doesn't exist here . so you should base length 
      if (self.errors().length>0) { 
       alert('login invalid');   
       self.errors.showAllMessages(); 
       return; 
      }  
     }; 

ValidatedObservable可取的方法恕我直言