我有一个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!
答案 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