Фильтр оператора не повторяется по элементу, отправленному из API - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь работать с оператором фильтра Angular 7. У меня есть API, выполненный в Express.Это простой пример.Этот API возвращает массив Object.Примерно так:

[
  {name: 'Admin'}, 
  {name: 'Invitado'}, 
  {name: 'Ejecutivo'}
]

Код API следующий:

function listRole(req, res) {
    var params = req.params;

    var page = 1;
    var cant = 10;

    if ( params.page ){
        page = parseInt(params.page);
    }

    if ( params.cant ){
        cant = parseInt(params.cant);
    }
    RoleModel.find().paginate(page, cant, (err, roles, total) => {
        if ( err ) {
            return res.status(500).send({
                message: err
            });
        }
        return res.status(200).send(
            roles
        );
    })

}

В приложении Angular 7 у меня есть служба, которая возвращает список ролей, соответствующих параметру.

Мой сервис:

  getRoles(role: string): Observable<any> {
    return this.http.get<any[]>(this.url).pipe(
      filter( (e: any) => {
        console.log(e) // this return an array
        return e.name === role;
      })
    );
  }

Когда я подписываюсь на этот сервис, данные становятся пустыми:

    this.userService.getRoles('Admin').subscribe( data => {
      console.log(data);
    });

Мой вопрос: Почему значениее в фильтре операторов вернуть массив? Я думаю, что я должен перебрать массив

Любая помощь благодарна

1 Ответ

1 голос
/ 22 мая 2019

Я нашел решение после поиска в нескольких блогах.

Оператор FlatMap преобразует элементы, испускаемые Наблюдаемой, в Наблюдаемые, а затем сглаживает выбросы из них в одну Наблюдаемую

Итак, первое, что нужно применить - этот оператортак что он преобразует ответ в Observable, который испускает элементы и может проходить через каждый.Решение состоит в следующем:

  getRoles(role: string): Observable<any> {
    return this.http.get<any[]>(this.url).pipe(
      flatMap( (data) => data ),
      filter( (e: any) => {
        return e.name === role;
      })
    );
  }

Это решение является правильным, но имеет детализацию.Я не могу перебрать массив элементов, потому что flatMap возвращает Observable.То есть, когда я подписываю меня на этот сервис, я не перебираю массив, в шаблоне я не могу использовать * ngFor.

Эту деталь я решил:

  getRoles(role: string): Observable<any> {
    return this.http.get<any[]>(this.url).pipe(
      flatMap( (data) => data ),
      filter( (e: any) => {
        return e.name === role;
      }),
      toArray()
    );
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...