检查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
。因此,现在我了解了它如何传递条件,而不是为什么对象表单显示$valid
为false
的原因。我还做了一个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);
之类的方法手动执行它们。