Angular:我需要 "change detection" 方面的帮助
Angular : I need help on "change detection"
我正在做一个 angular 项目,我需要掌握变更检测以使我的项目可用。
这是一个最小的复制:https://stackblitz.com/edit/angular-3py5bh
<div *ngIf="timeleft$ | async as timeleft"> //countdown (rxjs)
{{timeleft}}
</div>
<hello></hello> // simulated intensive function
所以,基本上,我有一个带倒计时的主要组件,每 0.01 秒刷新一次。
在这个组件中,我有一个嵌入式 "hello" 组件,它包括(在实际项目中)相当密集的计算。我用 "slow function".
模拟了这些密集的计算
问题:每次倒计时刷新(所以 100 times/second),Hello 组件也会刷新,并调用 "slow function"...
结果倒计时显示坏了(太慢了)!!!
我知道答案取决于 "change detection",但我太新了,无法很好地处理它。
这就是我请求您帮助的原因!
非常感谢!!!
哔叽
我会尝试在您的 'slow' 组件上设置 changeDetection: ChangeDetectionStrategy.OnPush。这修复了你的 stackblitz,见下文:
import { ChangeDetectionStrategy, Component, Input} from '@angular/core';
@Component({
selector: 'hello',
template: `<h1>Result : {{mySlowFunction(8)}}!</h1>`,
styles: [`h1 { font-family: Lato; }`],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class HelloComponent {
@Input() name: string;
mySlowFunction(baseNumber) {
let result = 0;
for (var i = Math.pow(baseNumber, 7); i >= 0; i--) {
result += Math.atan(i) * Math.tan(i) ;
};
return result;
}
}
我正在做一个 angular 项目,我需要掌握变更检测以使我的项目可用。
这是一个最小的复制:https://stackblitz.com/edit/angular-3py5bh
<div *ngIf="timeleft$ | async as timeleft"> //countdown (rxjs)
{{timeleft}}
</div>
<hello></hello> // simulated intensive function
所以,基本上,我有一个带倒计时的主要组件,每 0.01 秒刷新一次。 在这个组件中,我有一个嵌入式 "hello" 组件,它包括(在实际项目中)相当密集的计算。我用 "slow function".
模拟了这些密集的计算问题:每次倒计时刷新(所以 100 times/second),Hello 组件也会刷新,并调用 "slow function"...
结果倒计时显示坏了(太慢了)!!!
我知道答案取决于 "change detection",但我太新了,无法很好地处理它。 这就是我请求您帮助的原因!
非常感谢!!! 哔叽
我会尝试在您的 'slow' 组件上设置 changeDetection: ChangeDetectionStrategy.OnPush。这修复了你的 stackblitz,见下文:
import { ChangeDetectionStrategy, Component, Input} from '@angular/core';
@Component({
selector: 'hello',
template: `<h1>Result : {{mySlowFunction(8)}}!</h1>`,
styles: [`h1 { font-family: Lato; }`],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class HelloComponent {
@Input() name: string;
mySlowFunction(baseNumber) {
let result = 0;
for (var i = Math.pow(baseNumber, 7); i >= 0; i--) {
result += Math.atan(i) * Math.tan(i) ;
};
return result;
}
}