检查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
类。
我将尝试制作一个plunkr来演示,但我无法想象我能够复制它。
更新如果我console.log(ctrl.$valid)
打印true
。所以现在我知道它是如何通过条件的,但不是为什么对象表单显示$valid
为false
。
此外,我制作了一个plnkr,它显示了我正在做的事情的一个例子,但不遭受同样的问题。 example
答案 0 :(得分:4)
你试过这个:
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);
的内容来手动执行它们。