Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 为什么即使输入不';当使用OnPush策略时,是否不会改变?_Angular - Fatal编程技术网

Angular 为什么即使输入不';当使用OnPush策略时,是否不会改变?

Angular 为什么即使输入不';当使用OnPush策略时,是否不会改变?,angular,Angular,目前正试图让我的头脑明白这一点: @Component({ selector: 'app-test', template: `value: {{value|json}} <button (click)="setValue()">set</button>`, changeDetection: ChangeDetectionStrategy.OnPush }) export class TestComponent { @Input() name!: strin

目前正试图让我的头脑明白这一点:

@Component({
  selector: 'app-test',
  template: `value: {{value|json}} <button (click)="setValue()">set</button>`,
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class TestComponent {
  @Input() name!: string;
  value = false;

  setValue() {
    timer(100)
      .subscribe(() => this.value = true);
  }
}
@组件({
选择器:“应用程序测试”,
模板:`value:{{value | json}}}set`,
changeDetection:ChangeDetectionStrategy.OnPush
})
导出类TestComponent{
@输入()名称!:字符串;
值=假;
setValue(){
计时器(100)
.subscribe(()=>this.value=true);
}
}
单击按钮不会立即触发重新渲染,但第二次单击按钮会导致视图更新

从组件中删除
changeDetection
(或将其设置为
ChangeDetectionStrategy.Default
)也会导致在单击按钮后立即重新呈现视图

在这一点上,真正让我困惑的是:

  • 为什么在使用
    OnPush
    策略时甚至会重新渲染视图?就我所知,这个策略不应该只在
    @Input
    更改时重新呈现吗
  • 为什么单击两次按钮后会重新渲染

据我所知,即使使用OnPush策略,在DOM事件上angular也会运行一个更改检测周期。事实上,这是在使用OnPush策略时触发更改检测周期的唯一异步API(DOM)

我的猜测是,由于计时器的原因,第二次单击的值正在改变


这是一篇关于这个主题的好文章

点击按钮会触发刷新,因为您正在订阅点击事件。组件内的事件处理程序也会触发要运行的更改检测


第一次它看起来不会刷新,因为您添加了延迟,并且组件刷新发生在值更改之前。

有意义。试图将可观察对象更改为(true)的
,这会导致即时重新渲染。非常感谢。