问题标签 [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.
angularjs - AngularJS:在调用 $scope.$apply() 时防止错误 $digest 已经在进行中
我发现自从以 Angular 构建应用程序以来,我越来越需要手动将页面更新到我的范围。
我知道这样做的唯一方法是$apply()
从我的控制器和指令的范围内调用。这样做的问题是它不断向控制台抛出错误,内容如下:
错误:$digest 已经在进行中
有谁知道如何避免此错误或以不同的方式实现相同的目标?
javascript - Angular:从指令更新模型
我在这里有一个小提琴:http: //jsfiddle.net/KdkKE/44/
我想做的是创建一个“切换”组件,基本上是一个自定义复选框,但如果它是真或假,html 会发生变化,它绑定到控制器中的布尔值。
当用户单击切换时,模型会更新,指令的视图会发生变化。它类似于指令文档http://docs.angularjs.org/guide/directive末尾的示例,但状态将被绑定,以便在启动时正确。
-
javascript - 避免 $timeout() 强制摘要在 Angular 中完成
在我的 Angular 应用程序中,需要发生以下事件序列:
- 用户单击按钮
- 通过翻转 ng-show 绑定到的布尔范围变量来显示以前隐藏的 div
- 新显示的视图位于页面下方,应滚动到视图中。
目前,滚动不起作用,因为这一切都发生在同一个摘要中。这意味着 ng-show 绑定变量的新状态没有机会更新 DOM。因此,我们尝试滚动到就 DOM 而言尚不可见的元素。
这可以通过使用 $timeout 包装滚动调用来缓解,这会强制所有摘要在尝试滚动之前完成。虽然这行得通,但感觉就像是 hack,我想知道是否有更好的方法来做到这一点。
这是一个演示问题的小提琴:
(请注意,此代码是我的真实代码的简化版本,只是为了演示问题,我意识到它没有遵循最佳实践。请放心,我的真实代码不会在控制器中执行直接的 DOM 操作。)
看法:
JS:
angularjs - Angular:为什么不将 $evalAsync 称为 $applyAsync?
关于范围的 Angular 初学者问题(此处的文档)。
$eval
在范围的上下文中执行表达式。$apply
基本上调用$eval
然后$digest
。- 为什么也
$evalAsync
调用$digest
(或更准确地说,$digest
调用确保)?
似乎真的应该调用它,不是吗?$
eval
Async
$
apply
Async
我是初学者——我错过了什么?
javascript - 如何检查摘要周期是否稳定(又名“角度编译完成了吗?”)
tl;dr:最初的问题是“如何在每个摘要周期触发回调?” 但潜在的问题要有趣得多,因为这两个都回答了,所以我继续修改了标题。=)
上下文:我试图控制 Angular 何时完成编译 HTML(出于 SEO 预渲染原因),在解决其所有依赖项、ngincludes、API 调用等之后。到目前为止,我发现的“最聪明”的方法是通过检查是否消化周期已经稳定。
所以我想,如果我每次触发摘要循环时都运行一个回调并保持当前时间,如果在任意间隔(2000ms)内没有触发其他循环,我们可以认为编译已经稳定并且页面是准备好为 SEO 爬虫存档。
到目前为止的进展:我认为观看 $rootScope.$$phase 可以,但是,虽然很多交互应该触发那个观察者,但我发现它只触发一次,在第一次加载时。
这是我的代码:
解决方案:添加了 Mr_Mig的解决方案(赞)以及一些改进。
javascript - Angular.js 深度对象解析
这是一个有点宽泛的问题,所以我会尽量简洁。
在处理应用程序的导入过程时,我遇到了以下数据结构:
父级列表由一个 API 调用提供,该父级的子级列表由每个父级 (1+n) 的附加 API 调用提供,以及imported
基于对象中是否存在某些内容的更改值localChildren
,已经导入平台的东西。foreignParent
,foreignChild
并且localChild
是由三个不同服务提供的具有不同结构的三个不同对象。
那么问题是,使用这个控制器操作中涉及的三个服务来构建一个大型对象数组,并简单地使用以下方法对其进行迭代是否更好ng-repeat
:
在这种情况下,如果服务中的对象列表发生变化,我将不得不设置观察者,遍历哈希,并重新计算导入的值localChildren
,另外跟踪对象
第二个选项似乎是为imported
andchildren
属性分配一个函数,我假设每个摘要周期都会计算它:
更简单的第三个选项是拥有一个没有函数属性的本机对象,并将函数放在控制器上:
目前控制器看起来或多或少是这样的:
不幸的是,这并没有按照我的预期工作,但那是因为我这边的数据问题。我和一些朋友讨论过这个问题,没有人知道被广泛接受的正确方法是什么,所以我提出将它发布到 StackOverflow 以获得第二个意见。
对于这些由多个服务组成的复杂嵌套列表,我根本不确定哪种方法是正确的,或者如何查看列表被消化了多少次,以及如何传播函数结果的变化。我敢肯定,在某些情况下,我可能需要一个明确$scope.$watch
的,甚至可能强制一个$scope.$digest
,但直到现在我还没有发现我必须深入研究手表或摘要。我还没有在野外找到足够复杂的示例应用程序来进行很好的比较。
javascript - 如何在我的净化 HTML 字符串中消化我的 Angular 指令?| AngularJS
在通过 ng-bind-html-unsafe 将 $scope.content 对象插入 DOM 后,我无法重新编译在 $scope.content 对象中找到的 Angular 代码。有人知道如何让 Angular 消化这段代码吗?提前致谢!
angularjs - 快速连续调用 $rootScope.$apply() 时 $digest 已在进行中
所以我有一个 AngularJS 服务来监听一些事件。在处理这些事件时,我需要调用不同的控制器并最终加载一个新视图。在一个事件处理程序中,我使用 $location.path() 然后调用 $rootScope.apply() 来触发到控制器的路由。这适用于该事件,但在其他事件中我收到以下错误:$rootScope:inprog Action Already In Progress
. 我猜它在第一种情况下有效,因为 $rootScope.apply() 是从侦听器函数内的另一个回调函数调用的,而其他处理程序试图仅从事件侦听器函数调用它。
如何让它适用于所有事件处理程序?
javascript - 角度:复选框组的验证与模型不同步
这组复选框需要至少选中一个才能启用提交按钮。
取消选择所有复选框会禁用该按钮。
所有复选框都使用相同的范围属性 (showRequired),将它们标记为必需。
发生的情况是,第一次单击并没有像应该那样启用按钮。选择和取消选择其他复选框会使整个事情变得混乱;无论复选框处于什么状态,在任何给定的点击上都可能会或很多不会启用该按钮。
麻烦拍摄它,我看到的是ng-valid类并不总是适用于所有复选框。有时它在一个复选框上,有时它在所有复选框上,或者它们的某种组合上。使用$timeout可以解决所有问题,但我不知道为什么,使用计时器会产生不好的代码气味。 一定会有更好的办法。
我可以手动调用验证函数以使视图与模型内联:
...导致我认为我正在踩着 $digest 循环。
.
.
以下仅在使用 $timeout 时有效:
$timeout 会触发另一个 $digest,但 $scoope.$apply() 也会触发。
那么给了什么?