0

我有一个 @Input 在它为真时做某事 ngOnChange 没有检测到它何时为假

@Input() viewMode: boolean;

  ngOnChanges(changes: SimpleChanges) {
    if (changes.viewMode.currentValue !== undefined) {    
      if (changes.viewMode.currentValue ) {
        this.populateForm(this._event);
      }else{
        this.doSomething()
      }
    }
  }


setValue(){

   this.viewMode = false; 
}

当我调用 setValue 函数时,它不属于 ngOnChange

4

2 回答 2

1

几天前,我自己也有这个疑问。我发现 -ngOnChanges不会以这种方式开火。ngOnChanges 仅在组件输入从外部更改时运行。即假设你有,

<app-selector [editMode]="true"></app-selector>

这会变成,

<app-selector [editMode]="false"></app-selector>

现在只有 angular 会运行 ngOnchanges。如果你想在这个变量的属性发生变化时做一些事情,你应该像这样使用这个变量的 setter 和 getter,


private _viewMode: boolean;

@Input() set viewMode(mode) {
  this._viewMode = mode;
  this.populateForm(this._event);
}

get viewMode() {
  return this._viewMode;
}

现在您可以调用您的函数,this.setValue()并且您的表单每次都会填充。

于 2019-10-03T18:16:35.847 回答
0

ngOnChanges仅当输入更改来自模板绑定(如<component [someInput]="value">. 如果您像这样手动设置它component.someInput = value,那会发生在更改检测周期之外,您需要以某种方式让 Angular 知道您已经更改了某些内容。

如果您仍然希望ngOnChanges触发,则必须手动执行。IE


constructor(private cd: ChangeDetectorRef) {}

setValue(){
  this.viewMode = false; 
  this.cd.detectChanges();
}

希望它可以帮助并澄清您的疑问!

于 2019-10-03T16:49:30.567 回答