- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
可能是我误解了 Angular changeDetection 策略。
这里是描述:
onPush
变更检测策略。loading
文本,而 http 服务调用正在进行中,然后在完成后使用 ngIf
使用原始变量 this.loading=true/删除文本假的
现在我的问题是,当应用程序最初加载时,我可以在 S2 小部件上看到 loading...
文本,然后数据被填充。
但是当我点击 S1 中的 notify sibling
按钮时,它确实触发了服务调用,但是当 http 正在处理时我看不到 loading...
文本。
这是 S1 的代码:
import { Component, OnInit } from '@angular/core';
import { MessagingService } from '../messaging.service';
@Component({
selector: 'app-parent',
templateUrl: './parent.component.html',
styleUrls: ['./parent.component.css']
})
export class ParentComponent implements OnInit {
constructor(private _sendMessage: MessagingService) { }
ngOnInit() {
}
notifyChild() {
this._sendMessage.notifySibling();
}
}
这里是S2的代码:
import { Component, OnInit,ChangeDetectionStrategy ,ChangeDetectorRef} from '@angular/core';
import { MessagingService } from '../messaging.service';
import { switchMap, takeUntil, delay } from 'rxjs/operators';
import { of } from 'rxjs';
@Component({
selector: 'app-child',
templateUrl: './child.component.html',
styleUrls: ['./child.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ChildComponent implements OnInit {
public loading = true;
public myData: any;
constructor(private _receiveMessage: MessagingService,private cd: ChangeDetectorRef) { }
ngOnInit() {
this._receiveMessage.registerNotification().pipe(
switchMap(res => {
this.loading = true;
/** Simulate http call below */
return of([res.data]).pipe(
delay(5000)
)
})
).subscribe(response => {
this.myData = response;
this.loading = false;
this.cd.markForCheck();
})
}
}
注意:我在订阅中添加了this.cd.markForCheck();
。如果我对此发表评论,就像我只看到 loading...
而没有显示任何数据
消息服务:
import { Injectable } from '@angular/core';
import { Subject, BehaviorSubject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class MessagingService {
public _notify = new BehaviorSubject({ data: "initial Call" });
public notify = this._notify.asObservable();
constructor() { }
notifySibling() {
this._notify.next({ data: 'call from sibling' });
}
registerNotification() {
return this.notify;
}
}
完整的工作示例发布在 stackblitz 上
最佳答案
OnPush
策略仅在 @Input
属性更改时运行检查如果你想在异步上下文中运行它,你必须调用 this.cd.markForCheck( )
自己在请求前和请求后。
ngOnInit() {
this._receiveMessage.registerNotification().pipe(
switchMap(res => {
this.loading = true;
/** note this */
this.cd.markForCheck();
return of([res.data]).pipe(
delay(1000)
)
})
).subscribe(response => {
this.myData = response;
this.loading = false;
this.cd.markForCheck();
})
}
https://stackblitz.com/edit/angular-pmvmgz
英语不是我的母语:(
关于具有原始值的 Angular onpush 变化检测策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53476204/
我有两个组件,都设置为 OnPush。调用 getAccount() 后,父组件将 accountLoading 设置为 true,然后在调用完成后将 accountLoading 设置为 false
我正在尝试衡量变化检测策略的性能差异。 我已经添加了 Angular 分析器,并使用 Default 检查,然后将 onPush 添加到我们的大多数组件,这些是结果:(开发模式) 默认:{ msPer
我不明白为什么子组件的更改检测会在这种情况下运行: import { Component, ChangeDetectionStrategy } from '@angular/core' @Compon
我不明白为什么子组件的更改检测会在这种情况下运行: import { Component, ChangeDetectionStrategy } from '@angular/core' @Compon
最好的使用方法是什么OnPush更改检测可以使更改灵活并且在测试中也非常简单?通过各种教程,我发现可以使用 OnPush : 首先是在 View 中直接使用服务中的可观察对象,我不确定该方法是否有效。
可能是我误解了 Angular changeDetection 策略。 这里是描述: 我有 2 个同级组件(S1 和 S2) 将这两个组件都视为显示一些图形数据的小部件 加载时,我想一开始就在两个
我正在编写一个 Angular 2 应用程序,出于性能原因,我尝试在所有地方使用 ChangeDetectionStrategy.OnPush。我有一个复杂的组件需要 OnPush 才能顺利工作,其中
我有一个看起来像这样的子组件: @Component({ selector: 'app-child', changeDetection: ChangeDetectionStrategy.OnP
我正在尝试熟悉 Angular 2 的 ChangeDetectionStrategy.OnPush 性能提升(如 here 所述)。但我这里有古玩盒。 我有父 AppComponent: @Comp
我正在构建一个包含许多组件的 Angular 4 应用程序,其中 ChangeDetectionStrategy 是 OnPush。同时the Angular Documentation on the
我是否应该始终在我的组件中使用 ChangeDetectionStrategy.OnPush? 我总是听说 OnPush 非常棒,它解决了很多问题,加快了 Angular 应用程序的速度,甚至摆脱了
我有一个数据表组件 ( angular2-data-table) 项目,我们将项目从 Angular 的传统变化检测更改为 OnPush 以优化渲染速度。 实现新的变更检测策略后,当数据对象发生突变(
我有一个使用服务提交一些数据的组件。 该组件使用 ChangeDetectionStrategy.OnPush ,但发生了一些奇怪的事情: 当请求 成功 : next回调被调用,formStatus更
正如标题所说:我正在处理一个非常大的项目,而且我使用过的组件很少 ChangeDetectionStrategy.OnPush以免表现不佳。我想知道,将策略的每个组件都放入“好”,以防万一,使用 Ch
我在理解 Angular OnPush 检测策略时遇到问题。当我执行一些异步操作时(例如从 TS 打开覆盖,这样就不会导致使用 OnPush 策略检测组件上的更改),然后我单击任意位置,或调用其他检测
我想在使用 OnPush 变化检测策略上传之前预览多张图片。 我试试这个 https://stackblitz.com/edit/angular-mnltiv 当我添加 OnPush 时它停止工作,我
我有一个使用 ngFor 显示子组件列表的父组件。我注意到随着 child 数量的增加,性能变得非常糟糕,所以我将两者都更改为 OnPush 更改检测策略。 这很有帮助,但仍然有一些情况会变慢,我可以
https://stackblitz.com/edit/angular-xpamld 问题:有人能帮我理解为什么我的原型(prototype)的 changeDetection: ChangeDete
当我们使用默认策略时,这些家伙可以触发变更检测(当然除了输入参数): 用户事件 计时器 ajax 响应 但是。当您切换到 OnPush 策略 时,它仅由事件 触发并且不适用于计时器和 http。 所以
@Component({ selector: "parent", template: ``, changeDetection: ChangeDetectionStrategy.
我是一名优秀的程序员,十分优秀!