我在尝试时遇到了问题:
newNoteText: ko.observable().extend({ required: { onlyIf: function () { return this.ShowNote == true } } })
我注意到这不起作用,但是当我像这样放回代码时,它工作正常:
newNoteText: ko.observable().extend({ required: true })
答案 0 :(得分:4)
在规则上使用onlyIf
选项的正确语法是:
newNoteText: ko.observable().extend({
required: {
onlyIf: function(){
return someFlagIsTrue;
}
}
比照。 this answer您之前的一个问题(作者:敲门验证的主要撰稿人Eric Barnard)。
关于你的代码,除了Knockout Validation的语法之外,还有两件事需要担心:
return something == true
与return something
相同(不提及JavaScript处理==
和===
运算符的方式,详情请参阅此here)
在您的函数中,this
的值不是您认为的值(此处它指的是extend()
的括号之间的参数。)
如果要访问视图模型的其他一个可观察对象的值,您应该执行以下操作:
newNoteText: ko.observable().extend({
required: {
onlyIf: function(){
return self.ShowNote();
}
}
在视图模型构造函数的顶部定义self,例如var self = this;
。详细了解此模式here。
答案 1 :(得分:0)
不需要ThibWeb提到的params选项 - knockout.validation.js在addExtender方法中默认设置为true:
if (params.message || params.onlyIf) {
return ko.validation.addRule(observable, {
rule: ruleName,
message: params.message,
params: utils.isEmptyVal(params.params) ? true : params.params,
condition: params.onlyIf
});
Eric Barnard的答案是在2011年,大概是在此之前违约。
但是,如果您的代码设置了任何验证默认值,您可能会在HTML中编写HTML5必需属性,或者读取HTML中设置的属性:
ko.validation.configure({
parseInputAttributes: true, //default is false
writeInputAttributes: true //default is false
});
我发现这会导致只有一个必需的条件被有效忽略,因为你要添加一个额外的必需规则,这个规则总是被应用。