问题标签 [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.

0 投票
1 回答
346 浏览

angular - 当我从 ChangeDetectorRef 调用 detach() 时,为什么会调用 ngDoCheck()?

我正在浏览一些关于更改检测的文章,我试图使用changeDetectorRef.detach()and启用或禁用更改检测changeDetectorRef.reattach()

我还将组件连接到ngDoCheck()唯一发现ngDoCheck()即使在detach(). 我究竟做错了什么 ?有人可以解释为什么ngDocheck()叫?我什ChangeDetectionStartegy至也设置OnPush了。 这是我正在阅读以了解变更检测的文章

我还为此创建了一个示例:https ://stackblitz.com/edit/angular-4ytdbs

0 投票
1 回答
107 浏览

angular - 在 Angular 6 中使用 ChangeDetectionStrategy,需要在子元素(ng-class)上添加条件类

我有一个父组件

和一个子组件

使用 HTML

现在,当检测到任何更改时,li 标签内的这个跨度显示 true/false,但是当 isSelected 为 true 时,ng-class 应该添加“selectedItem”类,这不会发生。

0 投票
0 回答
32 浏览

angular - 为什么不把 ChangeDetectionStrategy.OnPush 放在每个组件上呢?

据我了解,changeDetection: ChangeDetectionStrategy.OnPush在组件上声明意味着它只会在其输入值之一被具体更改时更新,而不是在其父值更改时检查更改。如果是这样,为什么不是OnPush默认设置。有没有我们不想要这种行为的情况?

0 投票
1 回答
56 浏览

angular - 防止从 Injectable 检测变化

我在可注入的情况下每秒轮询服务器,但它会触发整个应用程序的更改检测,导致滚动每秒抖动。

示例:https ://stackblitz.com/edit/angular-1z9hbx

如果没有 NgZone.runOutsideAngular,有什么方法可以防止这种情况发生吗?

做 NgZone.runOutsideAngular 会使拦截器(在我的情况下可以显示模态)也运行在角度之外......哪个不好?

为什么可注入的更改会触发根组件的更改?

0 投票
1 回答
1437 浏览

javascript - 在 Angular 中渲染基于时间的 Observables 而不会检测到压倒性的变化

我们的 Angular 应用程序中有许多组件需要每秒定期显示每个组件独有的新值(倒计时、时间戳、经过的时间等)。最自然的方法是创建使用 RxJStimerinterval工厂函数的 observables。但是,这些会在整个应用程序的每个间隔触发 Angular 更改检测,次数与调用间隔函数的次数一样多。如果页面上有几十个组件,这会触发整个应用程序每秒或时间段数十次的更改检测,从而产生很大的性能开销。

到目前为止,我尝试了两种方法来解决这个问题。任何一个的好答案都会非常有帮助 - 理想情况下两者都是。我想避免手动触发更改检测,而是依赖从 Observables 发出的新值,并让异步管道/OnPush 更改检测策略负责触发更改检测。如果这不可能,我想了解原因。

  1. 有什么方法可以禁用或阻止 RxJStimerinterval函数触发 Angular 更改检测?使用 NgZonezone.runOutsideAngular(() => this.interval$ = interval(1000) ... )似乎不会这样做。StackBlitz 示例:https ://stackblitz.com/edit/angular-zo5h39
  2. 或者,如果我使用 RxJSSubject结合setInterval调用 inside创建一个 Observable 流zone.runOutsideAngular,为什么当从主题发出新值时不会为子组件触发更改检测?StackBlitz 示例:https ://stackblitz.com/edit/angular-yxdjgd
0 投票
5 回答
24128 浏览

angular - 表单组值更改时不会触发更改检测

我创建了一个简单的示例来演示我面临的一个奇怪的问题。

Stackblitz - https://stackblitz.com/edit/angular-change-detection-form-group

我有三个组件,它们是:

1 - 应用程序组件

2 - 你好组件

3 - 输入组件

在 hello 组件和 input 组件中,我都将 changedetection 策略设置为 onpush。正如您在上面看到的,我正在应用程序组件中创建一个表单组实例并将其传递给子组件。现在,当我单击应用程序组件上的按钮更改表单值时,它会更改输入字段中的值,但不会更改纯文本。它仅在我从两个子组件中删除推送更改检测时才有效。即使表单组值发生变化,也不会调用 ngOnChanges。

在此处输入图像描述

是不是很奇怪。更改检测如何用于输入而不是此处的纯文本?

有人可以解释一下吗?在不删除 onpush 更改检测的情况下,它的解决方法是什么。

0 投票
2 回答
63 浏览

angular - 如何在Angular 7中更改文本后获取具有可变文本的HTMLElement的大小?

我创建了一个具有输入属性text和公共属性的组件height。更改text组件的高度后,应计算并设置为height属性。

问题:在将文本设置为高度为 0 之后,似乎没有立即呈现 HTML。如果我在setTimeout()调用中读取元素的高度,我会得到正确的高度。

我将测试项目上传到 StackBlitz: https ://stackblitz.com/edit/angular-ivw9d7

该应用程序的作用是:

  1. 使用 lorem ipsum 设置 testComponent 的文本。
  2. 设置文本后立即获取高度并将其写入控制台。
  3. 设置文本后 2 秒正确获取高度并将其写入控制台。

在第 2 步中,高度为 0,在第 3 步中,高度为应有的高度。

0 投票
2 回答
891 浏览

angular - 从父级的ajax调用接收数据后如何更新子组件

我的应用程序结构如下,我的问题是如何在接收初始或未来数据时更新子组件视图,假设我只有一个具有事件 OnDataUpdate 的服务,所有子组件都接收相同的服务实例,因为它有另一方面,在 App 模块提供程序部分中声明,我尝试了所有这些方法并且没有工作:

  1. ApplicationRef.tick()
  2. ChangeDetectionRef.markForCheck()
  3. 变化检测策略
  4. 使用 OnDataRecieved 事件在组件之间共享服务,如下所示

在 App 根组件中,这就像下面的代码

想象模型在加载或更改数据时嵌套并通过子组件传播,结构可以是这样的

我在 ngDoCheck 中收到数据变化,不需要触发检测变化,但是 UI 和子组件没有更新!

0 投票
1 回答
319 浏览

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'。

0 投票
1 回答
1223 浏览

angular - Angular - 如何在任何时候触发列表的每个元素上的事件时不重建使用 *ngFor 创建的列表

<div>我有一个使用*ngFor指令生成的简单列表,例如

如您所见,只要方法返回的 Observableitems()发出,列表就会异步填充。在我的情况下,这样的 Observable 是 a ReplaySubject,如果知道这有什么用的话。然后,我使用 方法定义要应用于每个<div>元素的类getItemClass

我还想使用方法对每个项目的点击事件做出反应itemClick(i: number)

问题

任何时候单击一个div元素,即任何时候itemClick(i: number)运行该方法,似乎整个<div>s 列表都被重建了。我得出这个结论,观察到任何时候div单击一个元素,该items()方法也会运行。

问题

<div>单击其中一个元素时是否可以避免重建列表?我已经设置changeDetectionOnPush但它似乎并没有解决我的问题。