我如何告诉AngularJS“刷新”

我有一个单击事件发生在我的自定义指令的范围之外,所以不是使用“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> 

debugging时,我发现正在调用close(),isOpen正在更新为false,但AngularJS视图没有更新。 有没有办法我可以手动告诉Angular更新视图? 还是有更多的“angular”的方法来解决这个问题,我没有看到?

解决办法是打电话给…

 $scope.$apply(); 

…在我的jQuery事件callback。

为什么$apply应该被调用?

TL; DR$apply当你想要应用 Angular世界之外做出的改变时应该被调用。


只是为了更新@达斯汀的回答 ,下面是一个解释, 美元应用到底是什么为什么它的作品。

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

Angular允许将任何值用作绑定目标。 然后在任何JavaScript代码转向结束时,检查值是否已经改变。 那个检查绑定值是否已经改变的步骤有一个方法$scope.$digest() 1 。 我们几乎从来没有直接调用它,因为我们使用$scope.$apply()来代替(这将调用$scope.$digest )。

Angular仅监视expression式中使用的variables以及生存在范围内的$watch任何内容。 所以,如果你在Angular上下文中改变模型,你需要调用$scope.$apply()来传播这些改变,否则Angular不会知道它们已经被改变,因此绑定不会被更新。 。

使用

 $route.reload(); 

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