Да, эти концепции могут поначалу сбивать с толку.Но некоторая информация, указанная выше в отношении двусторонней привязки, неверна:
двусторонняя привязка
[(ngModel)]="lastName"
Любые изменениясвойство компонента отображается в шаблоне, а любое изменение в шаблоне задается в свойстве компонента.Это чаще всего используется в полях ввода и для шаблонно-управляемых форм.
Выше приведена краткая версия:
<input [ngModel]="lastName" (ngModelChange)="lastName = $event">
Односторонняя / привязка свойства
[ngModel]="lastName"
Интерфейс пользователя синхронизируется со значением свойства компонента.Это похоже на интерполяцию: {{lastName}}
Однократная привязка
ngModel="lastName"
Связывает только начальное значение свойства компонента ине изменится, если значение изменится.
Переменные ссылки на шаблон
#lastNameVar="ngModel" /* for a form model element eg input element*/
#f="ngForm" /* for the form itself */
Основная цель ссылочной переменной шаблона - предоставить ссылку на элемент в шаблоне .Вам не нужно добавлять его к каждому элементу ввода в управляемой шаблоном форме, только к тем, к которым вы хотите получить доступ.
Например:
<div class="form-group row mb-2">
<label class="col-md-2 col-form-label"
for="lastNameId">Last Name</label>
<div class="col-md-8">
<input class="form-control"
id="lastNameId"
type="text"
placeholder="Last Name (required)"
required
maxlength="50"
[(ngModel)]="customer.lastName"
name="lastName"
#lastNameVar="ngModel"
[ngClass]="{'is-invalid': (lastNameVar.touched || lastNameVar.dirty) && !lastNameVar.valid }" />
<span class="invalid-feedback">
<span *ngIf="lastNameVar.errors?.required">
Please enter your last name.
</span>
<span *ngIf="lastNameVar.errors?.maxlength">
The last name must be less than 50 characters.
</span>
</span>
</div>
</div>
Обратите внимание, как выше указано, что переменная ссылки на шаблон установлена на #lastName
, а затем использует ее для установки стиля (с помощью [ngClass]
) и проверки коллекции ошибок для отображения соответствующего сообщения об ошибке.
Или для вашего примерас помощью формы вы можете проверить состояние формы, чтобы отключить кнопку Сохранить, например:
<button class="btn btn-primary"
type="submit"
[disabled]="!f.valid">
Save
</button>
Если вам не требуется доступ к состоянию формы в шаблоне, вам не нужнопеременная ссылки на шаблон.
Вы также можете передать переменную ссылки шаблона в компонент для доступа к значению или состоянию формы:
В шаблоне:
<form novalidate
(ngSubmit)="save(signupForm)"
#signupForm="ngForm">
Inкомпонент:
save(customerForm: NgForm) {
console.log('Saved: ' + JSON.stringify(customerForm.value));
}
Вы могли бы вместо этого передавать в переменную ссылки шаблона каждого отдельного элемента управления, но почему?Поскольку вы добавляете элементы управления с течением времени, вам нужно помнить, чтобы всегда добавлять их в вызов метода.И вам придется проверять состояние каждого элемента управления, а не только общее состояние формы.Намного легче / лучше / понятнее просто передать ссылку на форму.
<form novalidate
(ngSubmit)="save(lastName, firstName, phone, email)">