Как вы фильтруете таблицу mat, в которой есть массив? - PullRequest
0 голосов
/ 25 марта 2019

У меня есть таблица с 4 отображаемыми столбцами (email-firstname-фамилия-навыки), хранящимися в источнике данных, один из них - столбец «Навыки», и это массив, эти четыре столбца извлекаются из базы данных, моделидля пользователя:

Email [string]
firstname [string]
lastname [string]
skills 
{
 skill(id - reference to _id){
            _id: [id]
            name: [string]
          }
}

Я попытался использовать фильтр из углового урока без удачи

Я пытался использовать этот код здесь


    applyFilter(filterValue: string, abc: string) {
        // this.dataSource.filter = filterValue.trim().toLowerCase();
        // console.log(this.dataSource.filter)
        const re =  { $regex: new RegExp(filterValue).source, $options:'gi' };



        this.userService.getUsers({
          '$or': [
            { firstname: re} ,
            { lastname: re },
            { email: re },
            { 'skills.skill.name': re }
            ]



        }).subscribe(users => {
          this.dataSource.data = users;
          // console.log(users)
        })
      }

Я ожидаю, что фильтрработает на всю таблицу, но вместо этого код работает на все столбцы, кроме столбца «Навыки», любая идея?

Обновление:

структура дБ

на этом изображении есть моя структура mongodb, есть ли способ автоматического заполнения поля 'Skillname' через поле 'Skill', которое ссылается на другую структуру db?

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

В конце концов фильтр действительно работал, потому что я сохранял objectID, а не строку, поэтому я изменил это, и все работало просто отлично

0 голосов
/ 25 марта 2019

Поскольку вы используете наблюдаемые, воспользуйтесь этим:

data$ = this.userService.getUsers(...);
search = new FormControl('');
dataSource$ = combineLatest(
  this.search.valueChanges.pipe(startWith('')),
  this.data$
).pipe(
  map(([query, arr]) => arr.filter(item => item.XXX.includes(query)))
);

Теперь у вас есть Observable, содержащая только отфильтрованные результаты. Вы можете либо подписаться на него и создать из него свои данные, либо использовать async канал в своем HTML.

...