Учитывая список флажков, привязанных к одному и тому же formControlName
, как я могу создать массив значений флажков, привязанных к formControl
, а не просто true
/ false
?
Пример:
<form [formGroup]="checkboxGroup">
<input type="checkbox" id="checkbox-1" value="value-1" formControlName="myValues" />
<input type="checkbox" id="checkbox-2" value="value-2" formControlName="myValues" />
<input type="checkbox" id="checkbox-3" value="value-2" formControlName="myValues" />
</form>
checkboxGroup.controls['myValues'].value
в настоящее время производит:
true or false
Что я хочу, чтобы это произвело:
['value-1', 'value-2', ...]
javascript
angular
checkbox
angular2-forms
ReactingToAngularVues
источник
источник
Ответы:
С помощью ответа сайленсода я написал решение для получения значений вместо состояний в моем formBuilder.
Я использую метод для добавления или удаления значений в formArray. Это может быть плохой подход, но он работает!
component.html
component.ts
Когда я отправляю свою форму, например, моя модель выглядит так:
Не хватает только одного: функции для заполнения formArray, если ваша модель уже проверила значения.
источник
myChoices: new FormArray([], Validators.required)
Вот хорошее место для использования
FormArray
https://angular.io/docs/ts/latest/api/forms/index/FormArray-class.htmlДля начала мы создадим наш массив элементов управления либо с помощью, либо с
FormBuilder
помощьюFormArray
FormBuilder
новый FormArray
Достаточно просто сделать, но затем мы собираемся изменить наш шаблон и позволить шаблонному движку обрабатывать то, как мы привязываемся к нашим элементам управления:
template.html
Здесь мы повторяем наш набор
FormControls
в нашемmyValues
FormArray
и для каждого элемента управления, который мы привязываем[formControl]
к этому элементу управления, а не к элементуFormArray
управления, и<div>{{checkboxGroup.controls['myValues'].value}}</div>
производимtrue,false,true
а также делаем синтаксис вашего шаблона немного менее ручным.Вы можете использовать этот пример: http://plnkr.co/edit/a9OdMAq2YIwQFo7gixbj?p=preview, чтобы ковыряться
источник
*ngFor="let control of checkboxGroup.controls['myValues'].controls ; let i=index""
В Angular 6 это сделать значительно проще, чем в предыдущих версиях, даже когда информация о флажке заполняется асинхронно из API.
Первое, что нужно понять, это то, что благодаря каналу Angular 6
keyvalue
нам больше не нужно использоватьFormArray
, и вместо этого мы можем вложитьFormGroup
.Сначала передайте FormBuilder в конструктор
Затем инициализируйте нашу форму.
Когда данные наших флажков доступны, повторите их, и мы можем вставить их прямо во вложенные
FormGroup
как именованныеFormControl
, без необходимости полагаться на массивы поиска с индексированными числами.Наконец, в шаблоне нам просто нужно перебрать
keyvalue
флажки: никаких дополнительныхlet index = i
, и флажки автоматически будут в алфавитном порядке: намного чище.источник
const checkboxes = ..
вне foreach;)Если вы ищете значения флажков в формате JSON
Полный пример здесь .
Прошу прощения за использование названий стран в качестве значений флажков вместо указанных в вопросе. Дальнейшее объяснение -
Создайте FormGroup для формы
Пусть каждый флажок будет FormGroup, созданной из объекта, единственным свойством которого является значение флажка.
Массив FormGroups для флажков используется для установки элемента управления для «стран» в родительской форме.
В шаблоне используйте канал, чтобы получить имя для элемента управления флажком
источник
Я не вижу здесь решения, которое полностью отвечает на вопрос с использованием реактивных форм в максимальной степени, поэтому вот мое решение для того же самого.
Резюме
Вот суть подробного объяснения вместе с примером StackBlitz.
FormArray
для флажков и инициализируйте форму.valueChanges
Наблюдаемым идеально подходит , когда вы хотите форму для отображения чего - то , но магазин что - то еще в компоненте. Сопоставьтеtrue
/false
values с желаемыми значениями.false
значения во время отправки.valueChanges
наблюдаемых.Пример StackBlitz
Детальное объяснение
Используйте FormArray для определения формы
Как уже упоминалось в ответе отмечен как правильный.
FormArray
это способ пойти в таких случаях, когда вы предпочитаете получать данные в виде массива. Итак, первое, что вам нужно сделать, это создать форму.Это просто установит начальное значение всех флажков на
false
.Затем нам нужно зарегистрировать эти переменные формы в шаблоне и выполнить итерацию по
checkboxes
массиву (НЕFormArray
по данным флажка), чтобы отобразить их в шаблоне.Используйте наблюдаемое valueChanges
Вот часть, о которой я не упоминаю ни в одном из приведенных здесь ответов. В таких ситуациях, как эта, когда мы хотели бы отобразить указанные данные, но сохранить их как что-то еще,
valueChanges
наблюдаемое очень полезно. ИспользуяvalueChanges
, мы можем наблюдать изменения в ,checkboxes
а затемmap
вtrue
/false
значения , полученные отFormArray
до требуемых данных. Обратите внимание, что это не изменит выбор флажков, так как любое правдивое значение, переданное флажку , помечает его как отмеченное и наоборот.Это в основном сопоставляет
FormArray
значения с исходнымcheckboxes
массивом и возвращает,value
если флажок отмечен какtrue
, иначе он возвращаетсяfalse
. ЗдесьemitEvent: false
важен, так как установкаFormArray
значения без него приведетvalueChanges
к срабатыванию события, создающего бесконечный цикл. УстановивemitEvent
наfalse
, мы удостоверяясьvalueChanges
наблюдаемое не излучает , когда мы устанавливаем значение здесь.Отфильтруйте ложные значения
Мы не можем напрямую фильтровать
false
значения в,FormArray
потому что это испортит шаблон, так как они привязаны к флажкам. Итак, лучшее возможное решение - отфильтроватьfalse
значения во время отправки. Для этого используйте оператор распространения.Это в основном отфильтровывает ложные значения из файла
checkboxes
.Отказаться от подписки на valueChanges
Наконец, не забудьте отказаться от подписки на
valueChanges
Примечание. Существует особый случай, когда значение не может быть установлено на
FormArray
входvalueChanges
, т.е. если значение флажка установлено на число0
. Это будет выглядеть так, как будто флажок не может быть установлен, так как при установке флажка вFormControl
качестве числа0
(ложное значение) будет установлено, и, следовательно, он не будет установлен. Было бы предпочтительно не использовать число0
в качестве значения, но если это необходимо, вы должны условно установить0
какое-то истинное значение, скажем, строку'0'
или просто,true
а затем при отправке преобразовать его обратно в число0
.Пример StackBlitz
В StackBlitz также есть код, когда вы хотите передать флажкам значения по умолчанию, чтобы они помечались как отмеченные в пользовательском интерфейсе.
источник
TL; DR
Иногда это также поражало меня, поэтому я попробовал оба подхода - FormArray и FormGroup.
В большинстве случаев список флажков был заполнен на сервере, и я получал его через API. Но иногда у вас будет статический набор флажков с вашим предопределенным значением. В каждом варианте использования будет использоваться соответствующий FormArray или FormGroup.
Для простоты представьте, что у вас есть простая форма создания продукта с
Во-первых, я создал форму только с названием продукта formControl. Это обязательное поле.
Поскольку категория динамически отображается, мне придется добавить эти данные в форму позже, когда данные будут готовы.
Есть два подхода к созданию списка категорий.
1. Сформировать массив
это
buildCategoryFormGroup
вернет мне FormArray. Он также принимает список выбранных значений в качестве аргумента, поэтому, если вы хотите повторно использовать форму для редактирования данных, это может быть полезно. Для создания новой формы продукта он пока не применим.Заметил, что при попытке доступа к значениям formArray. Это будет похоже
[false, true, true]
. Чтобы получить список выбранных идентификаторов, потребовалось немного больше работы для проверки из списка, но на основе индекса массива. Мне это не нравится, но работает.Вот почему я пришел к использованию
FormGroup
в этом отношении2. Группа форм
Отличие formGroup в том, что данные формы будут храниться в виде объекта, для чего требуется ключ и элемент управления формой. Поэтому рекомендуется установить ключ как categoryId, а затем мы сможем получить его позже.
Значение группы форм будет выглядеть так:
Но чаще всего мы хотим получить только список categoryIds как
["category2", "category3"]
. Я также должен написать прием, чтобы взять эти данные. Мне этот подход больше нравится по сравнению с formArray, потому что я действительно мог взять значение из самой формы.3. Пользовательский валидатор для проверки хотя бы одного флажка был выбран.
Я сделал валидатор, чтобы проверить, по крайней мере, флажок X был выбран, по умолчанию он будет проверять только один флажок.
источник
Сделайте событие, когда он щелкнет, а затем вручную измените значение true на имя того, что представляет флажок, тогда имя или true будет оценивать то же самое, и вы можете получить все значения вместо списка true / false. Пример:
component.html
component.ts
Это перехватывает событие после того, как оно уже было изменено на true или false с помощью Angular Forms, если оно истинно, я меняю имя на имя того, что представляет собой флажок, который при необходимости также будет оцениваться как true, если он проверяется на true / false как хорошо.
источник
Если вы хотите использовать реактивную форму Angular ( https://angular.io/guide/reactive-forms ).
Вы можете использовать один элемент управления формы для управления выводимым значением группы флажков.
составная часть
html
checklistState
Управляет моделью / состоянием входных данных контрольного списка. Эта модель позволяет сопоставить текущее состояние с любым нужным форматом значений.
Модель:
checklist
Контроль формыЭтот элемент управления хранит значение, которое вы хотите сохранить, например,
вывод значения:
"value_1,value_2"
См. Демонстрацию на https://stackblitz.com/edit/angular-multi-checklist
источник
Мое решение - решено для Angular 5 с представлением материалов
. Подключение осуществляется через
Таким образом, он может работать с несколькими массивами флажков в одной форме. Просто задайте имя массива элементов управления для подключения каждый раз.
В конце вы получаете возможность сохранить форму с массивом идентификаторов исходных записей для сохранения / обновления.
источник
ЧАСТЬ ШАБЛОНА: -
ЧАСТЬ КОНТРОЛЛЕРА: -
источник
Добавьте мои 5 центов) Модель моего вопроса
template.html
component.ts
источник
Связанный ответ на @ nash11, вот как вы создадите массив значений флажков
И
есть флажок, который также выбирает все флажки:
https://stackblitz.com/edit/angular-checkbox-custom-value-with-selectall
источник