当我在输入中设置值时,ngOnChange 没有检测到变化

ngOnChange dont detect change when i set value in Input

我有一个 @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

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

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


constructor(private cd: ChangeDetectorRef) {}

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

希望对您有所帮助,解开您的疑惑!

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

<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() 那样调用您的函数,您的表单每次都会填充。