gpt4 book ai didi

angular - changeDetection : ChangeDetectionStrategy. OnPush 似乎不起作用?

转载 作者:太空狗 更新时间:2023-10-29 18:12:49 24 4
gpt4 key购买 nike

https://stackblitz.com/edit/angular-xpamld

问题:有人能帮我理解为什么我的原型(prototype)的 changeDetection: ChangeDetectionStrategy.OnPush 仍然允许我更新内部值 name 吗?如果这不是 ChangeDetectionStrategy.OnPush 应该阻止的,它应该做什么?

app.component.ts:

@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AppComponent {
public name = 'Angular 5';
public changeName() {
this.name = 'Outer';
}
}

app.component.html:

<hello name="{{ name }}"></hello>
<button (click)="changeName()">Outter Change</button>
<p>{{name}}-- outer</p>
<p>
Start editing to see some magic happen :)
</p>

hello.component.ts:

@Component({
selector: 'hello',
template: `<h1>Hello {{name}}!</h1> <button (click)="changeName()">inner Change</button>`,
styles: [`h1 { font-family: Lato; }`],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class HelloComponent {
@Input() name: string;


public changeName() {
this.name = 'Inner';
}
}

最佳答案

因为原始数据类型是不可变的 - 如果您更改它,它的引用也会更改,所以您的组件的 ChangeDetectorRef 知道它必须检测更改(因为 OnPush 查找引用更改,而不是数组、对象中的数据突变)。如果你想在基元上避免这种情况,你可以使用 detach()/reattach() 在 ChangeDetectorRef 实例上手动停用/激活它:

import { ChangeDetectorRef } from '@angular/core';

export class HelloComponent {
@Input() name: string;

constructor(private ref: ChangeDetectorRef) {}

public changeName() {
this.ref.detach();
this.name = 'Inner';
}
}

关于angular - changeDetection : ChangeDetectionStrategy. OnPush 似乎不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48605736/

24 4 0
文章推荐: python - 从 Oracle 读取一个包含数百万行的大表并写入 HDF5
文章推荐: c# - 反向排序字典?
文章推荐: python - Python OpenCV 中 VideoCapture 的内存泄漏
文章推荐: Angular 5 从 http 请求中获取正确的 Observable 类型(为什么它总是 Observable?)