Validation 敲除验证isValid()无效

Validation 敲除验证isValid()无效,validation,knockout.js,Validation,Knockout.js,我有一个viewmodel,在那里我有一些属性,这些属性被扩展为使用验证。我调用ko.validation.group(self),但这不会将isValid()方法添加到viewmodel中 所以我得到一个错误,isValid()未定义 这是我的密码: var brechtbaekelandt = brechtbaekelandt || {}; brechtbaekelandt.login = (function ($, jQuery, ko, undefined) { "use strict

我有一个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小提琴:

我在某个地方读到你需要调用registerExtenders(),但我试过了,它也不起作用


有人能帮我找到正确的方向吗?谢谢

使用
group
时,您似乎在寻找
isValid
,但是有一种方法(替代方法)可以使用
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;
            }     
        };
工作样本


使用首选方式Imho

这样的工作样本。让我知道'是的,我知道这一个,我知道它工作,但在文档中说,我的方法也应该工作,并且ko.validation.group(self)应该将isValid()添加到self中。如果真的没有解决这个问题的办法,我一定会用你的例子超级酷!谢谢有人遇到了相同的问题,但已使用ko.validation.group()解决了该问题
validatedObservable
在后台调用组并存储在errors属性中,稍后我们调用showAllMessages。我从未尝试将
组作为备选方案。我想你无论如何都可以用小提琴版本,我会试试你看的东西。干杯<当您使用
group
时,code>isValid
不存在。您可以参考您指出的同一链接(第二个链接)。组只在数组中提供错误消息信息(如前面的注释所指出的)。如果您坚持要使用组中的
error().length
,请检查此处。哦,errors().length是一个很好的解决方案,我将使用此解决方案。非常感谢你!