问题标签 [angularjs-digest]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
28 回答
454429 浏览

angularjs - AngularJS:在调用 $scope.$apply() 时防止错误 $digest 已经在进行中

我发现自从以 Angular 构建应用程序以来,我越来越需要手动将页面更新到我的范围。

我知道这样做的唯一方法是$apply()从我的控制器和指令的范围内调用。这样做的问题是它不断向控制台抛出错误,内容如下:

错误:$digest 已经在进行中

有谁知道如何避免此错误或以不同的方式实现相同的目标?

0 投票
1 回答
24102 浏览

javascript - Angular:从指令更​​新模型

我在这里有一个小提琴:http: //jsfiddle.net/KdkKE/44/

我想做的是创建一个“切换”组件,基本上是一个自定义复选框,但如果它是真或假,html 会发生变化,它绑定到控制器中的布尔值。

当用户单击切换时,模型会更新,指令的视图会发生变化。它类似于指令文档http://docs.angularjs.org/guide/directive末尾的示例,但状态将被绑定,以便在启动时正确。

-

0 投票
12 回答
180214 浏览

angularjs - $apply 已经在进行中的错误

堆栈跟踪:

指这段代码http://pastebin.com/B9V6yvFu

奇怪的是,在我的 LG4X 上它工作正常,但是在我的三星 s2 上却抛出了上述错误。有什么想法有什么问题吗?

0 投票
1 回答
1186 浏览

javascript - 避免 $timeout() 强制摘要在 Angular 中完成

在我的 Angular 应用程序中,需要发生以下事件序列:

  1. 用户单击按钮
  2. 通过翻转 ng-show 绑定到的布尔范围变量来显示以前隐藏的 div
  3. 新显示的视图位于页面下方,应滚动到视图中。

目前,滚动不起作用,因为这一切都发生在同一个摘要中。这意味着 ng-show 绑定变量的新状态没有机会更新 DOM。因此,我们尝试滚动到就 DOM 而言尚不可见的元素。

这可以通过使用 $timeout 包装滚动调用来缓解,这会强制所有摘要在尝试滚动之前完成。虽然这行得通,但感觉就像是 hack,我想知道是否有更好的方法来做到这一点

这是一个演示问题的小提琴:

http://jsfiddle.net/fNhnj/3/

(请注意,此代码是我的真实代码的简化版本,只是为了演示问题,我意识到它没有遵循最佳实践。请放心,我的真实代码不会在控制器中执行直接的 DOM 操作。)

看法:

JS:

0 投票
2 回答
3954 浏览

angularjs - Angular:为什么不将 $evalAsync 称为 $applyAsync?

关于范围的 Angular 初学者问题(此处的文档)。

  1. $eval在范围的上下文中执行表达式。
  2. $apply基本上调用$eval然后$digest
  3. 为什么也$evalAsync调用$digest(或更准确地说,$digest调用确保)?

似乎真的应该调用它,不是吗?$evalAsync$applyAsync

我是初学者——我错过了什么?

0 投票
1 回答
1137 浏览

javascript - 如何检查摘要周期是否稳定(又名“角度编译完成了吗?”)

tl;dr:最初的问题是“如何在每个摘要周期触发回调?” 但潜在的问题要有趣得多,因为这两个都回答了,所以我继续修改了标题。=)

上下文:我试图控制 Angular 何时完成编译 HTML(出于 SEO 预渲染原因),在解决其所有依赖项、ngincludes、API 调用等之后。到目前为止,我发现的“最聪明”的方法是通过检查是否消化周期已经稳定。
所以我想,如果我每次触发摘要循环时都运行一个回调并保持当前时间,如果在任意间隔(2000ms)内没有触发其他循环,我们可以认为编译已经稳定并且页面是准备好为 SEO 爬虫存档。

到目前为止的进展:我认为观看 $rootScope.$$phase 可以,但是,虽然很多交互应该触发那个观察者,但我发现它只触发一次,在第一次加载时。

这是我的代码:



解决方案:添加了 Mr_Mig的解决方案(赞)以及一些改进。

0 投票
1 回答
150 浏览

javascript - Angular.js 深度对象解析

这是一个有点宽泛的问题,所以我会尽量简洁。

在处理应用程序的导入过程时,我遇到了以下数据结构:

父级列表由一个 API 调用提供,该父级的子级列表由每个父级 (1+n) 的附加 API 调用提供,以及imported基于对象中是否存在某些内容的更改值localChildren,已经导入平台的东西。foreignParentforeignChild并且localChild是由三个不同服务提供的具有不同结构的三个不同对象。

那么问题是,使用这个控制器操作中涉及的三个服务来构建一个大型对象数组,并简单地使用以下方法对其进行迭代是否更好ng-repeat

在这种情况下,如果服务中的对象列表发生变化,我将不得不设置观察者,遍历哈希,并重新计算导入的值localChildren,另外跟踪对象

第二个选项似乎是为importedandchildren属性分配一个函数,我假设每个摘要周期都会计算它:

更简单的第三个选项是拥有一个没有函数属性的本机对象,并将函数放在控制器上:

目前控制器看起来或多或少是这样的:

不幸的是,这并没有按照我的预期工作,但那是因为我这边的数据问题。我和一些朋友讨论过这个问题,没有人知道被广泛接受的正确方法是什么,所以我提出将它发布到 StackOverflow 以获得第二个意见。

对于这些由多个服务组成的复杂嵌套列表,我根本不确定哪种方法是正确的,或者如何查看列表被消化了多少次,以及如何传播函数结果的变化。我敢肯定,在某些情况下,我可能需要一个明确$scope.$watch的,甚至可能强制一个$scope.$digest,但直到现在我还没有发现我必须深入研究手表或摘要。我还没有在野外找到足够复杂的示例应用程序来进行很好的比较。

0 投票
1 回答
627 浏览

javascript - 如何在我的净化 HTML 字符串中消化我的 Angular 指令?| AngularJS

在通过 ng-bind-html-unsafe 将 $scope.content 对象插入 DOM 后,我无法重新编译在 $scope.content 对象中找到的 Angular 代码。有人知道如何让 Angular 消化这段代码吗?提前致谢!

柱塞在这里

0 投票
1 回答
11812 浏览

angularjs - 快速连续调用 $rootScope.$apply() 时 $digest 已在进行中

所以我有一个 AngularJS 服务来监听一些事件。在处理这些事件时,我需要调用不同的控制器并最终加载一个新视图。在一个事件处理程序中,我使用 $location.path() 然后调用 $rootScope.apply() 来触发到控制器的路由。这适用于该事件,但在其他事件中我收到以下错误:$rootScope:inprog Action Already In Progress. 我猜它在第一种情况下有效,因为 $rootScope.apply() 是从侦听器函数内的另一个回调函数调用的,而其他处理程序试图仅从事件侦听器函数调用它。

如何让它适用于所有事件处理程序?

plnkr 示例

0 投票
1 回答
1972 浏览

javascript - 角度:复选框组的验证与模型不同步

这组复选框需要至少选中一个才能启用提交按钮。
取消选择所有复选框会禁用该按钮。
所有复选框都使用相同的范围属性 (showRequired),将它们标记为必需。

发生的情况是,第一次单击并没有像应该那样启用按钮。选择和取消选择其他复选框会使整个事情变得混乱;无论复选框处于什么状态,在任何给定的点击上都可能会或很多不会启用该按钮。

麻烦拍摄它,我看到的是ng-valid类并不总是适用于所有复选框。有时它在一个复选框上,有时它在所有复选框上,或者它们的某种组合上。使用$timeout可以解决所有问题,但我不知道为什么,使用计时器会产生不好的代码气味。 一定会有更好的办法。

我可以手动调用验证函数以使视图与模型内联:

...导致我认为我正在踩着 $digest 循环。

.
.
以下仅在使用 $timeout 时有效:

$timeout 会触发另一个 $digest,但 $scoope.$apply() 也会触发。
那么给了什么?

Plunker 示例