问题标签 [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 - 为什么array.push 更新ChangeDetection.onPush 组件角度6 的视图?
我在包含汽车数组的角度应用程序上有 Race 组件。我的所有组件都使用 onPush 更改检测。
我在比赛组件上有一个按钮,该按钮仅使 cars.push(new Car) 和所有子组件视图根据此更新。
我不明白为什么视图会更新,它假设仅在参考更改时更新。
(我做了检查,我看到参考是相等的)
汽车组件只显示汽车。
有人可以解释为什么会这样?
种族成分 ts
种族组件 html -
汽车零部件 ts -
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。
实现我想要做的事情的最佳方式是什么?
angular - Angular QueryList 更改事件 ExpressionChangedAfterItHasBeenCheckedError
订阅 QueryList 更改事件以及对事件做出反应并更改视图绑定到的属性时。我得到一个 ExpressionChangedAfterItHasBeenCheckedError 并且该值就像旧值一样。
我做了一个 stackblitz示例来显示错误。
我可以通过在队列中添加一个微任务来解决它。但我只是想了解正在发生的事情。
谢谢
angular - 如何避免子组件滚动事件触发父组件中的更改检测
我正在使用BehaviorSubject
充当子组件状态的
async
在子组件模板中,我使用管道订阅状态
然后我用滚动事件更新子组件状态
现在在父组件中,更改检测由子组件滚动事件触发
问题是逻辑依赖于滚动事件,我不希望它触发父组件中的更改检测。知道我OnPush
在父组件和子组件中都使用更改检测策略
这是正常的吗?我怎样才能避免它?
这是一个最小的复制https://stackblitz.com/edit/angular-hkwvy4?file=src%2Fapp%2Fhello.component.ts
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
我有如下认证服务
我在哪里做错了。或者对此的解决方案/替代方案是什么。请帮忙!!
很长一段时间以来我一直坚持这一点
angular - 使组件使用者可配置 ChangeDetectionStrategy
假设 UI 库中有一个使用 的组件ChangeDetectionStrategy.Default
,但希望ChangeDetectionStrategy.OnPush
通过属性为消费者提供使用的选项(例如,对于性能敏感的情况)Input()
。
是否可以在运行时更改组件的更改检测策略?还是只能在@Component
装饰器中设置?
angular - Angular 7,如何将“更改检测策略”更改为所有组件的 onpush?
我想更改"default"
Angular 7 应用程序中所有组件的更改检测策略,并"onpush"
改为使用。
我应该怎么办?
我的解决方案是进入每个组件并编写以下代码:
当您想更改changedetection
整个应用程序的策略时,这是正确的方法,还是有其他(更好的方法)方法?
angular - 从服务器获取数据不会触发子组件中的更改检测
我正在开发一些应用程序,其中有一个具有某些属性的对象,并且当我发出 http 请求时,会将新属性添加到该对象中。
问题是发出请求时没有执行更改检测(本文指出,只要我不修改更改检测策略就应该执行它)。
因此,ngOnChanges
不会在我传递用户对象的子组件中调用,并且当值从服务器到达时我正在做一些复杂的事情。
我附上了一个简化的stackblitz演示。
注意:我知道当新数据到达时我可以传递该对象的副本,但我认为这应该是一种更好的方法。
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。
angular - Angular 中的变更检测
我试图更好地了解 ChangeDetection 是如何工作的,我有一个与此相关的问题。
如果我正在使用changeDetection: ChangeDetectionStrategy.OnPush
,在ngOnChanges
生命周期挂钩上我还需要验证是否currentValue
存在?还是足以验证输入是否已更改?
我可以举一个例子来更好地理解我在说什么:
所以,正如我所提到的,我正在使用changeDetection: ChangeDetectionStrategy.OnPush
,这是我的输入@Input() isInspectionReopened: boolean;
,ngOnChanges
看起来像这样:
足以验证changes.isInspectionReopened
还是我需要添加changes.isInspectionReopened.currentValue
?