Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS ngModelController_Javascript_Angularjs_Google Chrome_Google Chrome Devtools - Fatal编程技术网

Javascript AngularJS ngModelController

Javascript AngularJS ngModelController,javascript,angularjs,google-chrome,google-chrome-devtools,Javascript,Angularjs,Google Chrome,Google Chrome Devtools,检查ngModelController有效性的正确方法是什么 我在指令中有一个有效的控制器对象。如果我从指令内部将对象记录到控制台,我会得到: console.log(ctrl) 然后,如果我要求if(ctrl.$valid==true)再次将对象记录到控制台,它将使用完全相同的输出 console.log(ctrl); //ctrl.$valid is false if(ctrl.$valid == true) { console.log(ctrl); //ctrl.$valid is

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

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

console.log(ctrl)

然后,如果我要求
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来演示,但我无法想象我能复制这个

如果I
console.log(ctrl.$valid)
为打印
true
,则更新
。现在我知道了它是如何传递条件的,但不知道为什么对象形式显示
$valid
false

我还制作了一个plnkr,它显示了我正在做的一个示例,但它没有遇到相同的问题

您是否尝试过以下方法:

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

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

编辑-更多详细信息

如果您运行这个
varobj={a:1,b:{};控制台日志(obj);obj['a']=2;控制台日志(obj)在Chrome控制台中,您将看到以下输出:

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

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

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

您是否尝试过以下方法:

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

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

编辑-更多详细信息

如果您运行这个
varobj={a:1,b:{};控制台日志(obj);obj['a']=2;控制台日志(obj)在Chrome控制台中,您将看到以下输出:

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

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


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

从这个答案继续,那么,我相信当您在控制台中展开它时,它在对象形式中显示为false的原因是因为在
console.log()
调用之后运行了一些其他代码,该调用将它设置回有效状态。要从这个答案继续,那么,我认为,在控制台中展开对象时,它在对象窗体中显示为false的原因是在
console.log()之后运行了其他一些代码
调用,将其设置回有效状态。如果在查看
$valid
值时AngularJS摘要循环未完成,并且您的行为将依赖于它,您可能希望添加将该逻辑放入
ngModelController
$viewchangelisters
数组的回调中,或者使用
作用域。$watch(…)
尝试并观察变化。看看这个plunker:如果在查看
$valid
值时AngularJS摘要周期未完成,并且您的行为将取决于它,您可能希望添加将该逻辑放入
ngModelController
$viewchangelisters
数组的回调中,或者使用
作用域。$watch(…)
尝试观察更改。查看此插件: