Knockout 中的依赖验证不起作用
dependant validation in Knockout not working
我有一个包含多个 select 和一个文本框的模型。
如果其中 none 个已填充,我希望显示验证,但如果至少其中一个已填充,则不会出现验证错误。
(单击 select 中的一项或某些文本)。
我这里有一个工作的plunkr:
plnkr.co/edit/pwKohFTmLPW1BKNwHxWR?p=preview
我尝试了数千次都没有成功。
其核心问题是 self.isValid()
不会触发验证功能 SubscribersOrEmails
目前我有这个:
var ReportSchedule = function () {
self.Subscribers = ko.observableArray().extend({ required: { onlyIf: function () { return self.SubscribersOrEmails === 0; } } });
self.Emails = ko.observableArray().extend({ required: { onlyIf: function () { return self.SubscribersOrEmails === 0; } } });
self.EmailText = ko.observable();
self.SubscribersOrEmails = ko.computed(function () {
var counter = 0;
if (self.Emails != null && self.Subscribers != null) {
counter = self.Emails().length + self.Subscribers().length;
}
console.log("counter: " + counter);
return counter;
});
}
我尝试了自定义验证器和阳光下的每一种组合。
知道接下来要尝试什么吗?
我正在使用 knockout v3.2.0-beta
这应该可以解决。您的 computed
期望变量存在,并且您的验证例程期望 computed
存在,因此您需要将变量与其扩展分开。
您正在检查计算变量是否存在,但这阻止了 Knockout 找出依赖关系。
所需的参数可以是self.subscribersOrEmails
,不需要将其包装在函数中。
self.Subscribers = ko.observableArray();
self.Emails = ko.observableArray();
self.EmailText = ko.observable();
self.Name = ko.observable();
self.SubscribersOrEmails = ko.computed(function() {
console.log("validation ");
var counter = 0;
console.log(self.Emails);
console.log(self.Subscribers);
counter = self.Emails().length + self.Subscribers().length;
console.log("counter: " + counter);
return counter == 0;
});
self.Subscribers.extend({
required: {
onlyIf: self.SubscribersOrEmails,
params: 'Subscribers'
}
});
self.Emails.extend({
required: {
onlyIf: self.SubscribersOrEmails,
params: 'Emails'
}
});
此外:您正在覆盖 Emails
而不是在此处设置其内容:
self.populateEmails = function() {
self.Emails(self.getEmailsFromText(self.EmailText()));
}
还有这里:
$.each(self.schedulesViewModel.Schedules, function(index, schedule) {
var emailsArray = schedule.getEmailsFromText(schedule.EmailText());
schedule.Emails(emailsArray);
});
错误消息永远不会被清除,因为您没有清除它们的代码。
我有一个包含多个 select 和一个文本框的模型。
如果其中 none 个已填充,我希望显示验证,但如果至少其中一个已填充,则不会出现验证错误。 (单击 select 中的一项或某些文本)。
我这里有一个工作的plunkr: plnkr.co/edit/pwKohFTmLPW1BKNwHxWR?p=preview
我尝试了数千次都没有成功。
其核心问题是 self.isValid()
不会触发验证功能 SubscribersOrEmails
目前我有这个:
var ReportSchedule = function () {
self.Subscribers = ko.observableArray().extend({ required: { onlyIf: function () { return self.SubscribersOrEmails === 0; } } });
self.Emails = ko.observableArray().extend({ required: { onlyIf: function () { return self.SubscribersOrEmails === 0; } } });
self.EmailText = ko.observable();
self.SubscribersOrEmails = ko.computed(function () {
var counter = 0;
if (self.Emails != null && self.Subscribers != null) {
counter = self.Emails().length + self.Subscribers().length;
}
console.log("counter: " + counter);
return counter;
});
}
我尝试了自定义验证器和阳光下的每一种组合。
知道接下来要尝试什么吗?
我正在使用 knockout v3.2.0-beta
这应该可以解决。您的 computed
期望变量存在,并且您的验证例程期望 computed
存在,因此您需要将变量与其扩展分开。
您正在检查计算变量是否存在,但这阻止了 Knockout 找出依赖关系。
所需的参数可以是self.subscribersOrEmails
,不需要将其包装在函数中。
self.Subscribers = ko.observableArray();
self.Emails = ko.observableArray();
self.EmailText = ko.observable();
self.Name = ko.observable();
self.SubscribersOrEmails = ko.computed(function() {
console.log("validation ");
var counter = 0;
console.log(self.Emails);
console.log(self.Subscribers);
counter = self.Emails().length + self.Subscribers().length;
console.log("counter: " + counter);
return counter == 0;
});
self.Subscribers.extend({
required: {
onlyIf: self.SubscribersOrEmails,
params: 'Subscribers'
}
});
self.Emails.extend({
required: {
onlyIf: self.SubscribersOrEmails,
params: 'Emails'
}
});
此外:您正在覆盖 Emails
而不是在此处设置其内容:
self.populateEmails = function() {
self.Emails(self.getEmailsFromText(self.EmailText()));
}
还有这里:
$.each(self.schedulesViewModel.Schedules, function(index, schedule) {
var emailsArray = schedule.getEmailsFromText(schedule.EmailText());
schedule.Emails(emailsArray);
});
错误消息永远不会被清除,因为您没有清除它们的代码。