$scope.$watch 不在 ui.bootstrap.modal 控制器中引发事件

Posted

技术标签:

【中文标题】$scope.$watch 不在 ui.bootstrap.modal 控制器中引发事件【英文标题】:$scope.$watch not raising events inside a ui.bootstrap.modal controller 【发布时间】:2014-04-15 14:20:23 【问题描述】:

我正在为 Angular 使用 UI 引导程序,并且我已将 ui.bootstrap.modal 组件集成到我的解决方案中。除了一件事,一切都很好。我已经设置了一个 $scope.$watch 来监控位于模式后面的控制器上特定属性的更改,但是,当属性更改时它不会触发。

我已经在plunkr转载了

如您所见,它会在模式打开时触发一次,但不会在您更改 UI 中的复选框值时触发。乍一看,绑定看起来不错,因为更新一个复选框会更新另一个复选框(两者都绑定到相同的属性)。

有什么想法吗?

谢谢!

【问题讨论】:

【参考方案1】:

Angular $watch statements 总是至少触发一次以设置绑定

在观察者注册到作用域后,监听器 fn 是 异步调用(通过 $evalAsync)来初始化观察者。在 在极少数情况下,这是不可取的,因为在调用监听器时 watchExpression 的结果没有改变。检测这种情况 在侦听器 fn 中,您可以比较 newVal 和 oldVal。如果 这两个值是相同的(===)然后监听器被称为到期 初始化。

您收到有关设置的警报,但它似乎没有绑定任何内容,这就是您没有看到它再次被调用的原因。

您看到的是由于原型继承和原语导致的 Angular 限制。如果您将其更改为$scope.form = ; 并将其引用为form.chkVariable,它应该可以按预期工作。

http://plnkr.co/edit/3hCJ3EM1Gx1fCDSePQfa?p=preview

【讨论】:

您建议的修复解决了我的问题。非常感谢!

以上是关于$scope.$watch 不在 ui.bootstrap.modal 控制器中引发事件的主要内容,如果未能解决你的问题,请参考以下文章

$watch方法

如何在 AngularJS 中使用 $scope.$watch 和 $scope.$apply?

Scope的$watch和$digest原理

Angular - 带有 controllerAs、bindToController 和 $scope.$watch 的指令

ng -----监听变化($scope.$watch())

秒味课堂Angular js笔记------$scope.$watch和$scope.$apply