Вы не используете [(ngModel)]
при использовании построителя форм. Вместо этого вы должны использовать директиву formControlName
. Когда вы используете массивы построителя форм, вы также должны указывать директиву * 1003. *
Кроме того, вам нужно передать массив элементов управления в построитель форм вместо массива значений.
Я создам простой пример на основе вашего кода, чтобы показать вам, как вы применяете эту технику.
Если вы настроите форму в своем компоненте следующим образом:
component.ts
ngOnInit() {
this.values = ['', '', ''];
this.form = this.formBuilder.group({
values: this.formBuilder.array(
// this is an array of controls - NOT values
this.values.map(x => this.formBuilder.control(x))
)
});
}
Вы можете использовать директивы в HTML следующим образом:
компонент. html
<form (submit)="onSubmit()">
<fieldset [formGroup]="form">
<div formArrayName="values">
<div *ngFor="let value of values;let i = index">
<input [formControlName]="i" />
</div>
</div>
<button>Submit</button>
</fieldset>
</form>
Обратите внимание, как я обернул элементы управления формой с formArrayName
и установите formControlName
в индекс массива.
DEMO: https://stackblitz.com/edit/angular-lbo6qn
Несколько элементов управления формы в массиве
Если Вы хотите создать несколько элементов управления для каждого элемента в массиве формы, вам нужно настроить форму, чтобы отразить это. Создайте элемент управления формы для каждого свойства в вашем массиве форм.
this.form = this.FB.group({
array: this.FB.array(
this.values.map(x => this.FB.group({
boolValue: this.FB.control(x.boolValue),
label: this.FB.control(x.label)
}))
)
});
Ваша структура HTML будет соответствовать структуре вашей формы:
<form [formGroup]="form" (submit)="onSubmit()">
<div formArrayName="array">
<div *ngFor="let value of values;let i = index">
<div [formGroupName]="i">
<input type="checkbox" formControlName="boolValue" />
<input type="text" formControlName="label" />
</div>
</div>
</div>
<button>Save</button>
</form>
После этого вы сможете получить доступ к обновленным значениям при отправке. , Опять же, ваш запрос соответствует объявленной структуре.
onSubmit() {
this.form.get('array').value.forEach((formGroup: FormGroup, i: number) => {
this.values[i].boolValue = formGroup['boolValue'];
this.values[i].label = formGroup['label'];
});
}
Ключевым моментом здесь является то, что структура директив формы в вашем HTML должна соответствовать структуре групп, массивов и элементов управления формой в вашей форме.
Развернутая демонстрация: https://stackblitz.com/edit/angular-xopwoz
Это всего лишь пример того, как вы применяете концепцию, а не конкретное c решение вашей проблемы. Ваша проблема использует поля даты и jQuery. Вопрос о том, как создавать поля ввода datepicker в Angular, находится вне области видимости и широко задается в inte rnet. Для вас не должно быть большой проблемой применять мои методы к вашей базе кода.