我有一个奇怪的错误,我不确定发生了什么。
当我检查一个对象时,我可以看到$ valid标签设置为true($ invalid显示为false)。但是当我打印出那个标签(例如object。$ valid)时,它会打印false(和object。$ invalid print true)。
$scope.$watch('ctrl.form', form => {
console.log('The form is set to: ', form);
console.log('The form is valid: ', form.$valid);
});
有谁知道为什么会这样?
答案 0 :(得分:2)
我怀疑问题是,该函数中的值仍然在更新;它正在观察值的变化,但仍未应用更改的值。这可能会使您在该处理程序中的代码无法预测。
由于您提到应用范围会引发“进行中”错误,这似乎是有效的(摘要仍然有效)。此代码片段检查正在进行的摘要,并在必要时回避它。
if ( ! $scope.$$phase ) {
$scope.$apply ();
}
请注意,Angular中的“$$”变量是“私有的”。你仍然可以访问它们,但你不是“应该”的。然而,这确实具有不像零超时那样随机模糊的好处。
或者,正如您已经看到的,0超时可以强制更新。这是一个黑客,但它确实有效,我已经看过它使用了几次。
最后,其中一个生命周期事件可能是这些跟踪的更好选择,这样您就知道您在组件的自然流中跟踪信息,其中摘要是可预测的。
关于那个生命周期钩子,如果你使用的是1.5(最后一段看起来很合适,可能就是你想要的那样):
New: $onChanges
This new hook is similar to ng2’s ngOnChanges. It is called whenever one way bindings are updated, with a hash containing the changes objects.
Prior to this hook you sometimes had to use a $watch in order to do some work whenever a value you’re bound to changes. Using this hook makes things clearer and removes the need to introduce a watch and a dependency on $scope.