onlyIf验证不起作用

时间:2013-02-20 21:13:47

标签: asp.net-mvc-3 knockout.js knockout-validation

我在尝试时遇到了问题:

newNoteText: ko.observable().extend({ required: { onlyIf: function () { return this.ShowNote == true } } })

我注意到这不起作用,但是当我像这样放回代码时,它工作正常:

newNoteText: ko.observable().extend({ required: true })

http://sdrv.ms/WJC3fS

https://skydrive.live.com/redir?resid=33048714B5BF3B4B!2027

2 个答案:

答案 0 :(得分:4)

在规则上使用onlyIf选项的正确语法是:

newNoteText: ko.observable().extend({ 
  required: {
    onlyIf: function(){
      return someFlagIsTrue;
    }
  }

比照。 this answer您之前的一个问题(作者:敲门验证的主要撰稿人Eric Barnard)。


关于你的代码,除了Knockout Validation的语法之外,还有两件事需要担心:

  1. return something == truereturn something相同(不提及JavaScript处理=====运算符的方式,详情请参阅此here

  2. 在您的函数中,this的值不是您认为的值(此处它指的是extend()的括号之间的参数。)

    < / LI>

    如果要访问视图模型的其他一个可观察对象的值,您应该执行以下操作:

    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
});

我发现这会导致只有一个必需的条件被有效忽略,因为你要添加一个额外的必需规则,这个规则总是被应用。