我怎么能告诉AngularJS“刷新”

时间:2012-09-06 16:47:33

标签: javascript 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>

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

3 个答案:

答案 0 :(得分:291)

解决方案是打电话......

$scope.$apply();

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

答案 1 :(得分:23)

为什么要调用$apply

<强> TL; DR : 只要您想应用在Angular世界 之外的更改,就应该调用$apply

只是为了更新@Dustin's answer,以下是 $apply完全正确的解释和为什么的解释。

  

$apply()用于从外部执行AngularJS中的表达式   AngularJS框架。 (例如,来自浏览器DOM事件,   setTimeout,XHR或第三方库)。因为我们正在呼唤   我们需要在AngularJS框架中执行适当的范围生命周期   exception handlingexecuting watches

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

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

答案 2 :(得分:12)

使用

$route.reload();

记得将$route注入您的控制器。

相关问题