问题标签 [angular-changedetection]
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.
angular - 当我从 ChangeDetectorRef 调用 detach() 时,为什么会调用 ngDoCheck()?
我正在浏览一些关于更改检测的文章,我试图使用changeDetectorRef.detach()
and启用或禁用更改检测changeDetectorRef.reattach()
。
我还将组件连接到ngDoCheck()
唯一发现ngDoCheck()
即使在detach()
. 我究竟做错了什么 ?有人可以解释为什么ngDocheck()
叫?我什ChangeDetectionStartegy
至也设置OnPush
了。
这是我正在阅读以了解变更检测的文章
我还为此创建了一个示例:https ://stackblitz.com/edit/angular-4ytdbs
angular - 在 Angular 6 中使用 ChangeDetectionStrategy,需要在子元素(ng-class)上添加条件类
我有一个父组件
和一个子组件
使用 HTML
现在,当检测到任何更改时,li 标签内的这个跨度显示 true/false,但是当 isSelected 为 true 时,ng-class 应该添加“selectedItem”类,这不会发生。
angular - 为什么不把 ChangeDetectionStrategy.OnPush 放在每个组件上呢?
据我了解,changeDetection: ChangeDetectionStrategy.OnPush
在组件上声明意味着它只会在其输入值之一被具体更改时更新,而不是在其父值更改时检查更改。如果是这样,为什么不是OnPush
默认设置。有没有我们不想要这种行为的情况?
angular - 防止从 Injectable 检测变化
我在可注入的情况下每秒轮询服务器,但它会触发整个应用程序的更改检测,导致滚动每秒抖动。
示例:https ://stackblitz.com/edit/angular-1z9hbx
如果没有 NgZone.runOutsideAngular,有什么方法可以防止这种情况发生吗?
做 NgZone.runOutsideAngular 会使拦截器(在我的情况下可以显示模态)也运行在角度之外......哪个不好?
为什么可注入的更改会触发根组件的更改?
javascript - 在 Angular 中渲染基于时间的 Observables 而不会检测到压倒性的变化
我们的 Angular 应用程序中有许多组件需要每秒定期显示每个组件独有的新值(倒计时、时间戳、经过的时间等)。最自然的方法是创建使用 RxJStimer
和interval
工厂函数的 observables。但是,这些会在整个应用程序的每个间隔触发 Angular 更改检测,次数与调用间隔函数的次数一样多。如果页面上有几十个组件,这会触发整个应用程序每秒或时间段数十次的更改检测,从而产生很大的性能开销。
到目前为止,我尝试了两种方法来解决这个问题。任何一个的好答案都会非常有帮助 - 理想情况下两者都是。我想避免手动触发更改检测,而是依赖从 Observables 发出的新值,并让异步管道/OnPush 更改检测策略负责触发更改检测。如果这不可能,我想了解原因。
- 有什么方法可以禁用或阻止 RxJS
timer
或interval
函数触发 Angular 更改检测?使用 NgZonezone.runOutsideAngular(() => this.interval$ = interval(1000) ... )
似乎不会这样做。StackBlitz 示例:https ://stackblitz.com/edit/angular-zo5h39 - 或者,如果我使用 RxJS
Subject
结合setInterval
调用 inside创建一个 Observable 流zone.runOutsideAngular
,为什么当从主题发出新值时不会为子组件触发更改检测?StackBlitz 示例:https ://stackblitz.com/edit/angular-yxdjgd
angular - 表单组值更改时不会触发更改检测
我创建了一个简单的示例来演示我面临的一个奇怪的问题。
Stackblitz - https://stackblitz.com/edit/angular-change-detection-form-group
我有三个组件,它们是:
1 - 应用程序组件
2 - 你好组件
3 - 输入组件
在 hello 组件和 input 组件中,我都将 changedetection 策略设置为 onpush。正如您在上面看到的,我正在应用程序组件中创建一个表单组实例并将其传递给子组件。现在,当我单击应用程序组件上的按钮更改表单值时,它会更改输入字段中的值,但不会更改纯文本。它仅在我从两个子组件中删除推送更改检测时才有效。即使表单组值发生变化,也不会调用 ngOnChanges。
是不是很奇怪。更改检测如何用于输入而不是此处的纯文本?
有人可以解释一下吗?在不删除 onpush 更改检测的情况下,它的解决方法是什么。
angular - 如何在Angular 7中更改文本后获取具有可变文本的HTMLElement的大小?
我创建了一个具有输入属性text
和公共属性的组件height
。更改text
组件的高度后,应计算并设置为height
属性。
问题:在将文本设置为高度为 0 之后,似乎没有立即呈现 HTML。如果我在setTimeout()
调用中读取元素的高度,我会得到正确的高度。
我将测试项目上传到 StackBlitz: https ://stackblitz.com/edit/angular-ivw9d7
该应用程序的作用是:
- 使用 lorem ipsum 设置 testComponent 的文本。
- 设置文本后立即获取高度并将其写入控制台。
- 设置文本后 2 秒正确获取高度并将其写入控制台。
在第 2 步中,高度为 0,在第 3 步中,高度为应有的高度。
angular - 从父级的ajax调用接收数据后如何更新子组件
我的应用程序结构如下,我的问题是如何在接收初始或未来数据时更新子组件视图,假设我只有一个具有事件 OnDataUpdate 的服务,所有子组件都接收相同的服务实例,因为它有另一方面,在 App 模块提供程序部分中声明,我尝试了所有这些方法并且没有工作:
- ApplicationRef.tick()
- ChangeDetectionRef.markForCheck()
- 变化检测策略
- 使用 OnDataRecieved 事件在组件之间共享服务,如下所示
在 App 根组件中,这就像下面的代码
想象模型在加载或更改数据时嵌套并通过子组件传播,结构可以是这样的
我在 ngDoCheck 中收到数据变化,不需要触发检测变化,但是 UI 和子组件没有更新!
angular - ngu-carousel ponts 和 changeDetection 的问题
我有 ngu-carousel 点的问题。没有我怎么修
我的 HTML 代码
我在控制台中的问题:
ERROR 错误:ExpressionChangedAfterItHasBeenCheckedError:表达式在检查后已更改。以前的值:'ngForOf:'。当前值:'ngForOf:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18'。
angular - Angular - 如何在任何时候触发列表的每个元素上的事件时不重建使用 *ngFor 创建的列表
<div>
我有一个使用*ngFor
指令生成的简单列表,例如
如您所见,只要方法返回的 Observableitems()
发出,列表就会异步填充。在我的情况下,这样的 Observable 是 a ReplaySubject
,如果知道这有什么用的话。然后,我使用 方法定义要应用于每个<div>
元素的类getItemClass
。
我还想使用方法对每个项目的点击事件做出反应itemClick(i: number)
。
问题
任何时候单击一个div
元素,即任何时候itemClick(i: number)
运行该方法,似乎整个<div>
s 列表都被重建了。我得出这个结论,观察到任何时候div
单击一个元素,该items()
方法也会运行。
问题
<div>
单击其中一个元素时是否可以避免重建列表?我已经设置changeDetection
为OnPush但它似乎并没有解决我的问题。