我如何告诉 AngularJS“刷新”

IT技术 javascript angularjs
2021-02-17 00:27:45

我有一个在我的自定义指令范围之外发生的点击事件,所以我没有使用“ng-click”属性,而是使用 jQuery.click() 侦听器并在我的范围内调用一个函数,如下所示:

$('html').click(function(e) {
  scope.close();
);

close() 是一个简单的函数,如下所示:

scope.close = function() {
  scope.isOpen = false;
}

在我看来,我有一个“ng-show”绑定到 isOpen 的元素,如下所示:

<div ng-show="isOpen">My Div</div>

调试时,我发现调用了 close(),isOpen 被更新为 false,但 AngularJS 视图没有更新。有没有办法可以手动告诉 Angular 更新视图?或者有没有更“角度”的方法来解决我没有看到的这个问题?

3个回答

解决方案是调用...

$scope.$apply();

...在我的 jQuery 事件回调中。

@ErichBSchulz - 通常在指令中,我看到没有使用 $ 的范围,我认为这可能会区分它和注入控制器的“$scope”。在控制器中,通过 $scope 引用很重要,因此 Angular 知道要注入什么依赖项,而在指令链接函数中,它总是按顺序传递相同的 4 个元素,并且不需要特定名称(范围、元素、属性、控制器) )。
2021-05-03 00:27:45
我认为这个链接会有所帮助。jimhoskins.com/2012/12/17/angularjs-and-apply.html
2021-05-05 00:27:45
不应该是$scope.$apply();吗?
2021-05-05 00:27:45
您可以同时使用 $scope 或 scope,这只是符号差异,但结果相同。
2021-05-14 00:27:45

为什么$apply要叫?

TL;DR$apply应该在您想要应用Angular 世界之外所做的更改时调用


只是为了更新@Dustin 的回答,这里解释 $apply究竟做什么以及为什么起作用。

$apply()用于从 AngularJS 框架之外执行 AngularJS 中的表达式。(例如来自浏览器 DOM 事件、setTimeout、XHR 或第三方库)。因为我们正在调用 AngularJS 框架,所以我们需要执行异常处理执行监视的适当范围生命周期

Angular 允许将任何值用作绑定目标。然后在任何 JavaScript 代码循环结束时,它会检查该值是否已更改。检查任何绑定值是否已更改的步骤实际上有一个方法$scope.$digest()1我们几乎从不直接调用它,而是使用它$scope.$apply()(它将调用$scope.$digest)。

Angular 只监控表达式中使用的变量和$watch作用域内的任何东西因此,如果您在 Angular 上下文之外更改模型,则需要调用$scope.$apply()这些更改来传播,否则 Angular 将不知道它们已更改,因此绑定不会更新2

利用

$route.reload();

记得注入$route你的控制器。

另外,在使用 ui-router 时,请务必使用 $state.reload()
2021-04-21 00:27:45
这对我们的屏幕截图测试非常有帮助!我们模拟状态,但有时不一定有观察者观察变化,这可能导致混乱的失败或间歇性的失败。但是能够像这样重新加载范围有助于解决这个问题。
2021-05-13 00:27:45