我有一个在我的自定义指令范围之外发生的点击事件,所以我没有使用“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更新视图?或者是否有一种更“角度”的方法来解决这个我没有看到的问题呢?
答案 0 :(得分:291)
解决方案是打电话......
$scope.$apply();
...在我的jQuery事件回调中。
答案 1 :(得分:23)
$apply
? <强> TL; DR 强>:
只要您想应用在Angular世界 之外的更改,就应该调用$apply
。
只是为了更新@Dustin's answer,以下是 $apply完全正确的解释和为什么的解释。
$apply()
用于从外部执行AngularJS中的表达式 AngularJS框架。 (例如,来自浏览器DOM事件, setTimeout,XHR或第三方库)。因为我们正在呼唤 我们需要在AngularJS框架中执行适当的范围生命周期 exception handling,executing watches。
Angular允许将任何值用作绑定目标。然后在任何JavaScript代码转弯结束时,它会检查该值是否已更改。
检查是否有任何绑定值发生变化的步骤实际上有一个方法$scope.$digest()
1 。我们几乎从不直接调用它,因为我们使用$scope.$apply()
代替(将调用$scope.$digest
)。
Angular仅监视表达式中使用的变量以及范围内生成的$watch
内的任何内容。因此,如果要在Angular上下文之外更改模型,则需要调用$scope.$apply()
来传播这些更改,否则Angular将不知道它们已被更改,因此绑定将不会更新 2
答案 2 :(得分:12)
使用
$route.reload();
记得将$route
注入您的控制器。