问题标签 [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 投票
0 回答
370 浏览

angular - 为什么array.push 更新ChangeDetection.onPush 组件角度6 的视图?

我在包含汽车数组的角度应用程序上有 Race 组件。我的所有组件都使用 onPush 更改检测。

我在比赛组件上有一个按钮,该按钮仅使 cars.push(new Car) 和所有子组件视图根据此更新。

我不明白为什么视图会更新,它假设仅在参考更改时更新。

(我做了检查,我看到参考是相等的)

汽车组件只显示汽车。

有人可以解释为什么会这样?

种族成分 ts

种族组件 html -

汽车零部件 ts -

0 投票
2 回答
2873 浏览

angular - ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked - How to update template after Observable Value change

我浏览了很多 SO 帖子,试图找到解决这个问题的方法,我发现唯一一个有 hack 实现的帖子。我也订阅了从 ngrx 商店获取的 observable:

使用 ngIf 取决于模板内的这个可观察值:

每当 navigationSelected$ 的值发生变化时,都会抛出:

并且模板不会更新。我设法通过运行 cdRef.detectChanges(); 绕过它。在订阅结束时。它工作正常,但错误仍然被抛出,而且如上所述,它似乎是一个 hack。

实现我想要做的事情的最佳方式是什么?

0 投票
1 回答
1372 浏览

angular - Angular QueryList 更改事件 ExpressionChangedAfterItHasBeenCheckedError

订阅 QueryList 更改事件以及对事件做出反应并更改视图绑定到的属性时。我得到一个 ExpressionChangedAfterItHasBeenCheckedError 并且该值就像旧值一样。

我做了一个 stackblitz示例来显示错误。

我可以通过在队列中添加一个微任务来解决它。但我只是想了解正在发生的事情。

谢谢

0 投票
1 回答
390 浏览

angular - 如何避免子组件滚动事件触发父组件中的更改检测

我正在使用BehaviorSubject充当子组件状态的

async在子组件模板中,我使用管道订阅状态

然后我用滚动事件更新子组件状态

现在在父组件中,更改检测由子组件滚​​动事件触发

问题是逻辑依赖于滚动事件,我不希望它触发父组件中的更改检测。知道我OnPush在父组件和子组件中都使用更改检测策略

这是正常的吗?我怎样才能避免它?

这是一个最小的复制https://stackblitz.com/edit/angular-hkwvy4?file=src%2Fapp%2Fhello.component.ts

0 投票
2 回答
7427 浏览

angular - 仅在 Angular 7 中登录后启用注销按钮

我参考了以下链接,仅在登录 https://stackblitz.com/edit/angular-login-hide-navbar-ngif后启用注销按钮

我只想在用户登录时在导航栏中显示“注销”,我正在通过从“身份验证服务”调用“this.authservice.isUserLoggedIn”并将其分配给变量并写入来验证用户是否已登录ngif“注销”链接附近的情况。我已经使用 BehaviourSubject 来获取当前状态。但我不知道为什么代码不起作用,它总是返回 false,因此即使在用户登录后也没有启用“注销”链接

我有 header.component.ts

我有如下 header.component.html

下面是 login.component.ts

我有如下认证服务

我在哪里做错了。或者对此的解决方案/替代方案是什么。请帮忙!!

很长一段时间以来我一直坚持这一点

0 投票
1 回答
84 浏览

angular - 使组件使用者可配置 ChangeDetectionStrategy

假设 UI 库中有一个使用 的组件ChangeDetectionStrategy.Default,但希望ChangeDetectionStrategy.OnPush通过属性为消费者提供使用的选项(例如,对于性能敏感的情况)Input()

是否可以在运行时更改组件的更改检测策略?还是只能在@Component装饰器中设置?

0 投票
0 回答
45 浏览

angular - Angular 7,如何将“更改检测策略”更改为所有组件的 onpush?

我想更改"default"Angular 7 应用程序中所有组件的更改检测策略,并"onpush"改为使用。

我应该怎么办?

我的解决方案是进入每个组件并编写以下代码:

当您想更改changedetection整个应用程序的策略时,这是正确的方法,还是有其他(更好的方法)方法?

0 投票
1 回答
688 浏览

angular - 从服务器获取数据不会触发子组件中的更改检测

我正在开发一些应用程序,其中有一个具有某些属性的对象,并且当我发出 http 请求时,会将新属性添加到该对象中。

问题是发出请求时没有执行更改检测(本文指出,只要我不修改更改检测策略就应该执行它)。

因此,ngOnChanges不会在我传递用户对象的子组件中调用,并且当值从服务器到达时我正在做一些复杂的事情。

我附上了一个简化的stackblitz演示。

注意:我知道当新数据到达时我可以传递该对象的副本,但我认为这应该是一种更好的方法。

0 投票
0 回答
1275 浏览

angular - 初始组件加载后未重新应用 Ag-grid defaultColDef

当表格最初接收异步检索的数据时,Ag-grid 完美地使用 ngOnChanges 应用 defaultColDef 格式(cellStyle 和 cellRenderer)。但是,如果包含网格的组件被隐藏,然后通过 *ngIf 条件重新初始化,则表格将重新填充正确的数据,但即使像以前一样再次触发 ngOnChanges,也不会重新应用 defaultColDef 格式,并且this.gridOptions.defaultColDef = this.defaultColDef;在 ngOnChanges 的 onGridReady 回调中设置,我可以看到 this.defaultColDef 在调试期间被定义为正确的对象。

即使 this.defaultColDef 在 ngOnInit() 甚至在 ngOnChanges() 中再次重新定义也是如此(为简洁起见,仅包含在以下示例代码的构造函数中)。此外,如果整个 onGridReady: (params) 调用在 ngOnInit() 中重复。

相反,如果在父级中构造 columnDefs 对象时将相同的 cellStyle 和 cellRenderer 作为属性分配给 columnDefs,则在隐藏并重新显示(重新初始化)网格组件时正确应用格式设置。

实际结果:重新初始化组件后正确填充列和行,但未应用 defaultColDef。

预期结果:在 hide->show 后重新初始化组件后应用 defaultColDef。

0 投票
1 回答
130 浏览

angular - Angular 中的变更检测

我试图更好地了解 ChangeDetection 是如何工作的,我有一个与此相关的问题。

如果我正在使用changeDetection: ChangeDetectionStrategy.OnPush,在ngOnChanges生命周期挂钩上我还需要验证是否currentValue存在?还是足以验证输入是否已更改?

我可以举一个例子来更好地理解我在说什么:

所以,正如我所提到的,我正在使用changeDetection: ChangeDetectionStrategy.OnPush,这是我的输入@Input() isInspectionReopened: boolean;ngOnChanges看起来像这样:

足以验证changes.isInspectionReopened还是我需要添加changes.isInspectionReopened.currentValue