Knockout验证isValid()不起作用

时间:2015-10-20 11:50:04

标签: validation knockout.js

我有一个viewmodel,我有扩展的属性来使用验证。我调用ko.validation.group(self),但这不会将isValid()方法添加到viewmodel。

所以我得到一个错误,即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()的地方,但是我尝试了它,它也不起作用。

有人可以帮助我朝正确的方向发展吗? THX!

1 个答案:

答案 0 :(得分:4)

你在使用isValid时似乎正在寻找group很难有一种方法(替代方式)使用length属性来实现它。使用组时,isValid似乎不可用(它与validatedObservable一起存在)。

正如@jeff在本主题的一个答案中提到的那样

  

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

     

另一方面,ko.validatedObservable不仅收集了   错误消息,但也将模型包装在一个observable中,添加一个   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;
            }     
        };

使用group

的工作样本

使用 ValidatedObservable 的工作样本优选的方式Imho