我怎么能告诉AngularJS"刷新"

Dus*_*tin 162 javascript angularjs

我有一个在我的自定义指令范围之外发生的click事件,所以我没有使用"ng-click"属性,而是使用jQuery.click()监听器并在我的范围内调用一个函数,如下所示:

$('html').click(function(e) {
  scope.close();
);
Run Code Online (Sandbox Code Playgroud)

close()是一个简单的函数,如下所示:

scope.close = function() {
  scope.isOpen = false;
}
Run Code Online (Sandbox Code Playgroud)

在我看来,我有一个"ng-show"元素绑定到isOpen,如下所示:

<div ng-show="isOpen">My Div</div>
Run Code Online (Sandbox Code Playgroud)

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

Dus*_*tin 302

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

$scope.$apply();
Run Code Online (Sandbox Code Playgroud)

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

  • 我想这个链接会有所帮助.http://jimhoskins.com/2012/12/17/angularjs-and-apply.html (9认同)
  • 不应该是`$ scope.$ apply();`? (6认同)
  • @ErichBSchulz - 在指令中,我看到使用的范围没有$,我相信它可能会区分它和注入控制器的'$ scope'.在控制器中,通过$ scope引用是很重要的,因此Angular知道要注入什么依赖项,而在指令链接函数中,它总是通过序数传递相同的4个元素,并且不需要特定的名称(范围,元素,attrs,控制器) ). (4认同)

Mis*_*lis 27

为什么$apply要打电话?

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


只是为了更新@Dustin的答案,这里解释 $ apply究竟做了什么以及它为何起作用.

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

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

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


tes*_*t30 13

使用

$route.reload();
Run Code Online (Sandbox Code Playgroud)

记得注入$route你的控制器.

  • 此外,使用ui-router时,请务必使用`$ state.reload()` (5认同)