我怎样才能告诉AngularJS“刷新”

Posted

技术标签:

【中文标题】我怎样才能告诉AngularJS“刷新”【英文标题】:How can I tell AngularJS to "refresh" 【发布时间】:2012-08-31 13:08:41 【问题描述】:

我有一个在我的自定义指令范围之外发生的单击事件,因此我没有使用“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 更新视图?或者有没有更“角度”的方法来解决我没有看到的这个问题?

【问题讨论】:

【参考方案1】:

虽然以下对我有用:

$scope.$apply();

它需要更多的设置和使用.$on.$broadcast 才能工作或可能使用$.watch

但是,以下代码需要的代码少得多,而且工作起来就像一个魅力。

$timeout(function() );

在更新范围变量后立即添加超时允许 AngularJS 意识到有更新并自行应用它。

【讨论】:

【参考方案2】:

为什么要调用$apply

TL;DR$apply 应该在您想要应用在 Angular 世界外部所做的更改时调用。


只是为了更新@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 将不知道它们已被更改,因此绑定将不会更新@987654326 @.

【讨论】:

【参考方案3】:

使用

$route.reload();

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

【讨论】:

另外,在使用ui-router时,请务必使用$state.reload() 这对我们的截图测试非常有帮助!我们模拟出状态,但有时不一定有观察者来观察变化,这可能会导致混乱的故障或间歇性故障。但是能够像这样重新加载范围有助于解决这个问题。【参考方案4】:

解决方案是调用...

$scope.$apply();

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

【讨论】:

我认为这个链接会很有帮助。 jimhoskins.com/2012/12/17/angularjs-and-apply.html 不应该是$scope.$apply();吗? 您可以同时使用 $scope 或 scope,这只是符号的区别,但结果相同。 @ErichBSchulz - 通常在指令中,我看到使用的范围没有 $ 我认为这可能会区分它和注入控制器的“$scope”。在控制器中,通过 $scope 引用很重要,因此 Angular 知道要注入什么依赖项,而在指令链接函数中,它总是按序号传递相同的 4 个元素,并且不需要特定名称(范围、元素、属性、控制器)。

以上是关于我怎样才能告诉AngularJS“刷新”的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS API

我怎样才能告诉 proguard 假设一个包没有被使用?

轮询:页面被刷新,任何指定的过滤器/排序顺序也被重置。我怎样才能防止这种情况发生?

NAudio:我怎样才能得到一个告诉我 MP3 文件已结束的事件?

angular是怎么工作的

刚用IDEA从SVN下载下来前台angularJS的项目,要怎样才能运行起来,求解!!