Двустороннее связывание в реактивных формах
используя Angular 2, двусторонняя привязка проста в формах, управляемых шаблоном - вы просто используете синтаксис banana box. Как бы вы воспроизвели это поведение в форме, управляемой моделью?
например, вот стандартная реактивная форма. Давайте притворимся, что это намного сложнее, чем кажется, с большим количеством различных входов и бизнес-логики, и поэтому более подходит для подхода, основанного на модели, чем на шаблоне.
export class ExampleModel {
public name: string;
// ... lots of other inputs
}
@Component({
template: `
<form [formGroup]="form">
<input type="text" formControlName="name">
... lots of other inputs
</form>
<h4>Example values: {{example | json}}</h4>
`
})
export class ExampleComponent {
public form: FormGroup;
public example: ExampleModel = new ExampleModel();
constructor(private _fb: FormBuilder) {
this.form = this._fb.group({
name: [ this.example.name, Validators.required ]
// lots of other inputs
});
}
this.form.valueChanges.subscribe({
form => {
console.info('form values', form);
}
});
}
на subscribe()
Я могу примените все виды логики к значениям формы и сопоставьте их по мере необходимости. Однако я не хочу сопоставлять каждое входное значение из формы. Я просто хочу увидеть значения для всего employee
модель, как она обновляется, в подходе, похожем на [(ngModel)]="example.name"
, и как показано в трубе json в шаблоне. Как я могу это сделать?
4 ответов
можно использовать [(ngModel)]
с реактивными формами.
<form [formGroup]="form">
<input name="first" formControlName="first" [(ngModel)]="example.first"/>
<input name="last" formControlName="last" [(ngModel)]="example.last"/>
</form>
export class App {
form: FormGroup;
example = { first: '', last: '' };
constructor(builder: FormBuilder) {
this.form = builder.group({
first: '',
last: ''
})
}
}
это будет совершенно другая директива, чем та, которая будет использоваться без the formControlName
. С реактивными формами это будет FormControlNameDirective
. Без formControlName
на NgModel
директива будет использоваться.
иногда вам может потребоваться объединить [(ngModel)] с реактивными формами. Я могу быть некоторым inputcontrol, который вам не нужен как часть формы, но вам все равно нужно привязать его к контроллеру. Тогда вы можете использовать:[(ngModel)]="something" [ngModelOptions]="{standalone: true}"
Если вы просто хотите показать входное значение, просто создайте переменную в своем входе и используйте ее в своем шаблоне.
... множество других входов <h4>Example values: {{ name.value }}</h4>
поддержка с использованием ngModel свойство ввода и ngModelChange событие с реактивной формы директивы deprecated в угловой В6 и будет удалено в угловом v7.
Так согласно угловому направляющему выступу мы можем иметь 3 варианта:
- использование активных форм.
- на основе шаблонов использования формы.
- отключите это предупреждение, предоставив конфигурацию для ReactiveFormsModule.
источник:https://next.angular.io/api/forms/FormControlName#use-with-ngmodel