Angular: 无法获取 ElementRef 属性

Angular: Cannot get ElementRef property

我有以下代码将 this.child 克隆到 objngAfterViewInit方法:

import { Component, Input, ViewChild, ElementRef } from '@angular/core';

@Component({
  selector: 'child',
  template: `<input [value]="value">`,
})
export class ChildComponent {
  @Input() value: string;
}

@Component({
  selector: 'app-root',
  template: '<child [value]="value" #child></child>',
})
export class AppComponent {
  value = 'Some value';

  @ViewChild('child') child: ElementRef;

  ngAfterViewInit() {
    var obj: any = {};
    for (let prop in this.child)
      obj[prop] = (this.child as any)[prop];
    console.log('ngAfterViewInit', obj);
    // console.log('ngAfterViewInit', this.child.value); // but this line doesn't work!
  }
}

请查看来源https://stackblitz.com/edit/angular-ivy-rhacx7?file=src/app/app.component.ts

它工作正常并且记录 obj 包含 value 属性!但是,当我取消注释 ngAfterViewInit 方法的最后一行时,它会因错误而崩溃: 属性 'value' 在类型 'ElementRef'

上不存在

我试过 this.child.nativeElement.value 但这会导致另一个错误: 无法读取未定义的属性(读取 'value')

所以, 属性 "存在于this.child" 但它 确实 存在于 obj 中(前者的克隆!)。为什么会这样?

为什么我要为“克隆操作”而烦恼?因为当我简单地将 this.child 登录到控制台时,它 did 包含 value 属性!我想,也许它是 after ngAfterViewInitbefore 登录到控制台?这就是为什么我复制了 this.child 的状态,它在 during ngAfterViewInit.

那么,有人可以解释一下吗:

  1. 为什么链接代码不起作用?
  2. 为什么视图元素在 ngAfterViewInit 之前没有用它们的输入参数初始化?

那是因为 childChildComponent 类型,而不是 ElementRef:

working example

export class AppComponent {
  value = 'Some value';

  @ViewChild('child') child: ChildComponent;

  ngAfterViewInit() {
    var obj: any = {};
    for (let prop in this.child)
      obj[prop] = (this.child as any)[prop];
    console.log('ngAfterViewInit', obj);
    console.log('ngAfterViewInit', this.child.value);
  }
}

因此不需要克隆数据,该值已设置,只是 TypeScript 抱怨 ElementRef 没有 属性 value,这它没有。