我如何告诉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
注入你的控制器。