在我的angular应用程序中,我提出了一种情况,只有当输入绑定到更改时,才应该调用ngOnchanges.那么,有没有办法在ngOnInit之前阻止ngOnChanges的执行.有没有办法做到这一点.

推荐答案

你无法阻止这种行为,但你可以:

使用主题:

class Foo implements OnChanges,OnInit,OnDestroy{

  onChanges = new Subject<SimpleChanges>();

  ngOnInit(){
    this.onChanges.subscribe((data:SimpleChanges)=>{
      // only when inited
    });
  }
  ngOnDestroy(){
    this.onChanges.complete();
  }

  ngOnChanges(changes:SimpleChanges){
    this.onChanges.next(changes);
  }

}

使用布尔属性:

class Foo implements OnChanges,OnInit{

  initialized=false;

  ngOnInit(){
    // do stuff
    this.initialized = true;
  }

  ngOnChanges(changes:SimpleChanges){
    if(this.initialized){
      // do stuff when ngOnInit has been called
    }
  }

}

Use the SimpleChanges API

您还可以判断SimpleChange.isFirstChange()方法:

isFirstChange() : boolean

class Foo implements OnChanges,OnInit{

  @Input()
  bar:any;

  ngOnInit(){
    // do stuff
  }

  ngOnChanges(changes:SimpleChanges){
    if(!changes["bar"].isFirstChange()){
      // do stuff if this is not the initialization of "bar"
    }
  }

}

Angular相关问答推荐

我使用Ngrx的子集 Select 器不起作用

Angular 17上的material 工具提示的自定义样式

在Angular 17独立模式下,如何使用Swiper 11.0.5版使Bootstrap下拉菜单在Swiper元素外部可见

HTTP拦截器在Angular 17项目中不起作用

Primeng:安装ANGLE 16.2.0版本

当包含react 性模板绑定时,NG-Bootstrap手风琴不会打开

RXJS拆分返回值,多次调用后重新加入

在指令中获取宿主组件的templateRef

ngRouterOutlet和组件生命周期使用自定义模板渲染的问题

升级到 Webpack 5.79.0 后 NX Angular 项目构建失败

使用 Observable 进行渐进式填充

Angular:将间隔与增量和减量相结合

带有 Angular 2 的 Django

res.json() 不是函数

angular 2模板使用console.log

无法从模块it was neither declared nor imported导出服务

如何在悬停时向元素添加类?

如何以编程方式触发`valueChanges`?

Angular 2 router.navigate

如何在 Angular 2 中链接 HTTP 调用?