我怎么能告诉 AngularJS“刷新”

我有一个 click 事件发生在自定义指令的范围之外,所以我不使用“ 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 视图没有更新。有没有一种方法,我可以手动告诉角度更新视图?还是有一个更“角度”的方法来解决这个问题,我没有看到?

310054 次浏览

解决办法就是打电话给..。

$scope.$apply();

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

使用

$route.reload();

请记住将 $route注入到控制器中。

为什么要调用 $apply

DR : 当你想应用角度世界的 在外面改变时,应该调用 $apply


只是更新 达斯汀的回答,这里有一个解释的 什么 $申请确实做和 为什么它的工作。

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

角度允许使用任何值作为绑定目标。然后在任何 JavaScript 代码结束时,它检查该值是否已更改。 检查绑定值是否已更改的步骤实际上有一个方法 $scope.$digest()译自: 美国《纽约时报》网站(http://jimhoskins.com/2012/12/17/angularjs-and-applicy.html)。我们几乎从不直接调用它,因为我们使用 $scope.$apply()(它将调用 $scope.$digest)。

Angular 只监控表达式中使用的变量以及作用域内 $watch中的任何变量。所以如果你在角度上下文之外改变模型,你需要调用 $scope.$apply()来传播这些改变,否则角度不会知道它们已经被改变,因此绑定不会被更新 译自: 美国《科学》杂志网站(http://haroldrv.com/2015/02/using-scope-application-in-angularjs/)原著: http://haroldrv.com/2015/02/using-scope-application-in-angularjs/

下面这些对我来说确实有用:

$scope.$apply();

它需要更多的设置和使用 .$on.$broadcast工作或可能的 $.watch

然而,下面的代码所需要的代码要少得多,而且工作得非常出色。

$timeout(function() {});

在对 scope 变量进行更新之后立即添加超时,这使 AngularJS 能够意识到有一个更新,并自己应用它。