Просто предоставив тег input
с переменной шаблона, #inputPhoneNumber
назначит объектное представление JavaScript этого HTMLElement
переменной шаблона.
Попробуйте с этим:
<p> Input Field - With Just Template Varaible:</p>
<input
class="form-control"
type="text"
[(ngModel)]="phoneNumber"
pattern="[\d]*"
#first
required
/>
<div *ngIf="first.errors?.pattern">
Phone number must only contain digits
</div>
<div>Two Way Binding: {{phoneNumber}}</div>
<div>ViewChild Native Element: {{viewChildFirst?.nativeElement | json}}</div>
<div>ViewChild Control: {{viewChildFirst.control | json}}</div>
<div>#first: {{first?.value}}</div>
А в классе компонентов:
@ViewChild('first') viewChildFirst;
Как очевидно, viewChildFirst.control
не будет определяться в этом случае.
Но при присвоении ngModel
переменной шаблона будет присвоено представление FormControl
этого элемента HTML переменной шаблона.
Попробуйте с этим:
<p> Input Field - With Template And ngModel assigned</p>
<input
class="form-control"
type="text"
[(ngModel)]="phoneNumber"
pattern="[\d]*"
#second="ngModel"
required
/>
<div *ngIf="second.errors?.pattern">
Phone number must only contain digits
</div>
<div>Two Way Binding: {{phoneNumber}}</div>
<div>ViewChild Native Element: {{viewChildSecond?.nativeElement}}</div>
<div>ViewChild Conttrol: {{viewChildSecond.control | json}}</div>
<div>#second: {{second?.value}}</div>
<hr>
А в классе компонентов:
@ViewChild('second') viewChildSecond;
На этот раз viewChildSecond?.nativeElement
не будет определено, но viewChildSecond.control
будет.
Вы можете проверить это, точно распечатав переменную шаблона, как я делал выше. Вот рабочий образец StackBlitz для вашей ссылки.