7

我有一个 Angular 组件,它在自身内部动态创建各种其他类型的组件。@Input它通过OnChanges钩子将自己的属性绑定到子组件属性。

当子组件的更改检测设置为默认值时,此绑定可以正常工作。然后检测到新输入并更新组件模板。

但是,当更改检测为 OnPush 时不起作用,则不会检测到更改。我相信应该检测到这种变化,因为一个新的不可变对象,一个字符串,被分配给一个组件@Input属性。

这是一个演示: https ://plnkr.co/edit/0wHQghtww2HXVbC27bC1

如何让这个父到动态子属性绑定与 ChangeDetectionStrategy.OnPush 一起使用?

4

1 回答 1

8

OnPush 组件的可能解决方法是使用 setter 和cdRef.markForCheck()

更改检测-onpush.component.ts

@Component({
  selector: 'app-change-detection-onpush',
  template: `
    <div>
      ChangeDetectionStrategy.OnPush: {{ message || '[blank]' }}
    </div>`,
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class ChangeDetectionOnPushComponent implements IMyComponent {
  private _message: string;

  constructor(private cdRef: ChangeDetectorRef) {}

  set message(val: string) {
    this.cdRef.markForCheck();
    this._message = val;
  }

  get message() {
    return this._message;
  }
}

修改后的 Plunker

于 2017-01-23T06:36:56.507 回答