Проблема
Требуемый вывод представляет собой массив чисел, в то время как выборка вернет true
или false
, поскольку это флажок. В подобных ситуациях, когда форма содержит значения, отличные от желаемых, вы можете использовать valueChanges
, чтобы обнаружить изменения в определенном FormControl
и извлечь желаемый результат из FormControl
или FormArray
.
Решение
Поскольку вам нужен массив, первое, что вам нужно сделать, это создать FormArray
для selectedContactInfo
.
contactInfo = {
privateMobile: 1800124152,
workMobile: 1800124124
};
this.checkoutForm = this.formBuilder.group({
selectedAccount: '',
selectedContactInfo: this.formBuilder.array(Object.keys(this.contactInfo).map(key => false))
});
Обратите внимание, что мы инициализируем FormArray
используя contactInfo
. Это в основном получит ключи от объекта и создаст массив одинаковой длины со значениями false
(поскольку изначально значениями флажков являются false
). Конечно, если вам нужно, чтобы он был отмечен по умолчанию, вам необходимо сопоставить выбор с флажками, но для примера мы начнем со всех значений false
.
Регистрация FormArray в шаблоне
Установите FormArrayName
в шаблоне, чтобы мы получили доступ к значениям true
/ false
из флажка. Используйте KeyValuePipe , поскольку мы выполняем итерацию по contactInfo
, который является объектом.
<div class="item-container" formArrayName="selectedContactInfo">
<ng-container *ngFor="let contactNumber of contactInfo | keyvalue; let i = index">
<mat-checkbox [formControlName]="i">{{contactNumber.value}}</mat-checkbox>
</ng-container>
</div>
Отображение массива FormArray в valueChanges
Теперь,selectContactInfo
будет массивом значений true
/ false
в соответствии с выбором флажков. Это не то, что нам нужно, поэтому мы подпишемся на valueChanges
, отобразим данные на contactInfo
и сохраним их в переменной с именем selectedContactInfo
(обратите внимание, что это отличается от FormArray
).
const control = this.checkoutForm.controls.selectedContactInfo;
this.subscription = control.valueChanges.subscribe(value => {
this.selectedContactInfo = Object.keys(this.contactInfo).map((contactNo, index) =>
control.value[index] ? this.contactInfo[contactNo] : null
)
.filter(contactNo => !!contactNo);
});
То, что мы делаем здесь, - это получение массива true
/ false
из FormArray
и его отображение в contactInfo
. Если значение флажка true
, верните число, иначе верните null
. Затем используйте filter
для фильтрации значений null
.
Не забудьте отписаться от подписки valueChanges
.
ngOnDestroy() {
this.subscription.unsubscribe();
}