2

我在尝试做时遇到了问题:

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

4

2 回答 2

4

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

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

参照。是对您之前的一个问题的回答(由 Knockout Validation 的主要贡献者 Eric Barnard 提供)。


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

  1. return something == truereturn something(不提及 JavaScript 的处理方式==和运算符,请在此处===查看更多信息)相同。

  2. 在您的函数中, 的值this并不是您认为的那样(这里它指的是括号之间的参数extend())。

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

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

self 在视图模型构造函数的顶部定义,例如var self = this;. 在此处查看有关此模式的更多信息。

于 2013-02-23T17:04:01.270 回答
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 年,大概在这被默认为 true 之前。

但是,如果您的代码设置了任何验证默认值,您可能会将 HTML5 必需属性写入 HTML,或者读取 HTML 中设置的属性:

ko.validation.configure({
    parseInputAttributes: true, //default is false
    writeInputAttributes: true //default is false
});

我发现这会导致 onlyIf required 条件被有效忽略,因为您要添加始终应用的额外必需规则。

于 2013-11-07T15:59:39.403 回答