AngularJS ngModelController

时间:2014-01-30 00:24:06

标签: javascript angularjs google-chrome google-chrome-devtools

检查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。所以现在我知道它是如何通过条件的,但不是为什么对象表单显示$validfalse

此外,我制作了一个plnkr,它显示了我正在做的事情的一个例子,但遭受同样的问题。 example

1 个答案:

答案 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);的内容来手动执行它们。