检查ngModelController有效性的正确方法是什么?

我在指令中有一个有效的控制器对象。如果我从指令内部将对象记录到控制台,则会得到:

console.log(ctrl)

$dirty: false
$invalid: true
$modelValue: ""
$name: undefined
$pristine: true
$valid: false
$viewValue: ""
...


然后,如果我要求if( ctrl.$valid === true )将对象再次记录到控制台,则它会使用完全相同的输出。

console.log(ctrl); //ctrl.$valid is false
if(ctrl.$valid == true) {
    console.log(ctrl); //ctrl.$valid is false
}


另外,如果检查元素,则可以看到正在应用适当的ng-invalid类。

我将尝试做一个笨拙的演示,但是我无法想象可以复制它。

更新如果我console.log(ctrl.$valid)是打印true。因此,现在我了解了它如何传递条件,而不是为什么对象表单显示$validfalse的原因。

我还做了一个plnkr,它显示了我在做什么的一个示例,但是它没有遇到相同的问题。 example

最佳答案

您是否尝试过:

console.log(JSON.stringify(ctrl));
if(ctrl.$valid == true) {
    console.log(JSON.stringify(ctrl));
}


要么

console.log("$valid is ", ctrl.$valid);
if(ctrl.$valid == true) {
    console.log("$valid should be true and is actually ", ctrl.$valid);
}


它可能与this(旧)Chrome错误有关。我相信预期的行为是,当您在控制台中扩展对象时,您会在扩展时而不是在日志时获取对象的值,因此您需要在日志记录时将对象打印为字符串或将其克隆。

编辑-更多详细信息...

如果您在Chrome控制台中运行此var obj = {a: 1, b: {}}; console.log(obj); obj['a'] = 2; console.log(obj);,则会看到以下输出:

> Object {a: 1, b: Object}
  a: 2
  b: Object
  __proto__: Object

> Object {a: 2, b: Object}
  a: 2
  b: Object
  __proto__: Object


编辑2

希望这能回答您的问题。看来您可能在调用$parsers之后将解析器添加到$setViewValue(...)数组中。结果,当您的指令首次初始化时,您添加的任何验证都不会执行。添加解析器后,可以通过调用ctrl.$setViewValue(ctrl.$viewValue);之类的方法手动执行它们。

10-04 22:17
查看更多