Есть ли способ искать (фильтровать) FormArray в угловых реактивных формах?

Я ищу вариант использования в реактивных формах angular для фильтрации поля ввода элемента управления динамической формы в FormArray на основе ключа. Я приложил снимок экрана с моей реализацией. В поле поиска мне нужно найти следующие свойства на основе ключи.

Dynamic_Control_Filter


person Bhuvanesh    schedule 07.09.2019    source источник
comment
вы пытаетесь отсортировать элементы формы перед инициализацией? т.е. сортировать по ключу в алфавитном порядке? или вы хотите отсортировать элементы управления на основе ввода данных пользователем? Если это первое, то вы можете просто использовать метод сортировки в своем массиве свойств, прежде чем создавать группу форм. это должно привести к сортировке ваших элементов управления формой. глядя на образец stackblitz, если вы хотите отсортировать элементы управления, когда пользователь добавляет новое свойство, вы можете использовать тот же метод сортировки в методе addproperty, который у вас есть в настоящее время   -  person Edward    schedule 08.09.2019


Ответы (1)


FormArray является расширением класса AbstractControl , который предоставляет наблюдаемые значения valueChanges с последними значениями. Все значения, введенные в вашу форму, доступны как POJO в значениях этого потока. Вы можете объединить этот поток со своим запросом и отфильтровать значения, соответствующие вашим критериям. Черт возьми, ваш поисковый запрос может быть в той же FormGroup, что и ваш FormArray с парами ключ-значение.

// ngOnInit for instance
form$.valueChanges.pipe(
  map(value => {
    // here, filter your key value pairs which meet your criteria and give them back in a way you can build your form in the HTML
  })
);

Трудно сопоставить наблюдаемый источник с чем-то, что вы можете использовать в своем шаблоне HTML, чтобы вы все еще могли привязать соответствующий FormControl к вводу. Таким образом, ваш HTML может немного отличаться от стандартного примера FormArray, потому что вы не можете * ngFor напрямую через форму, а через специально созданный поток. Вы по-прежнему можете привязать каждый ввод к соответствующему FormControl, просто выполняя [formControl]="myMethodToGetTheRightControl(blabla)" без использования formArrayName, formGroupName и formControlName.

Так что, может быть, это не так просто, но это можно сделать. Если вы дадите stackblitz своим (частичным) кодом, я смогу разработать свою концепцию, чтобы вы показали, что я имею в виду.

person Joep Kockelkorn    schedule 07.09.2019
comment
Привет, Джоп, вот моя ссылка на стек. Stackblitz - Angular - person Bhuvanesh; 07.09.2019
comment
Итак, вот моя реализация. Мне пришлось использовать директиву formControl для привязки каждого FormControl к вводу. Также мне пришлось использовать опцию updateOn: 'blur' в FormControl, чтобы пользователь не нарушал технику фильтрации при обновлении ключа или значения. Также несколько советов по HTML / CSS: даже при использовании Bootstrap старайтесь использовать как можно меньше узлов DOM, чтобы ускорить работу браузера и сохранить аккуратный и аккуратный шаблон HTML. Когда семантическое имя класса, а затем примените стили в вашем файле .css. - person Joep Kockelkorn; 08.09.2019
comment
Да, конечно, Джоп. я ценю ваши усилия, и это то, что я искал. спасибо за советы. - person Bhuvanesh; 08.09.2019