Angular, как мне отфильтровать данные из наблюдаемой, используя канал rxjs - PullRequest
0 голосов
/ 17 мая 2018

Я вызываю метод getWorkOrders () в своем служебном файле, который, в свою очередь, обращается к серверу для получения записей.

Вот мой сервис. Я использую новый HttpClient.

export class BackendServices {
  private BASE_URL ='http://localhost:3000/backend';
  constructor(private http: HttpClient) {}
  getWorkOrders(){
    return this.http.get(this.BASE_URL + '/getworkorders/');
 }
}

Файл Component.ts

private woSubject = new BehaviorSubject<IWorkOrders[]>([]);
    getWorkOrders() {
        this.bs.getWorkOrders()
          .subscribe((data: any) =>
            this.woSubject.next(data),
        );
      }

Из компонента getWorkOrders метод, как мне отфильтровать данные из всех записей, которые были получены с сервера. Я понимаю, что он использует pipe & операторы filter rxjs, но не уверен, как их собрать.

enter image description here

1 Ответ

0 голосов
/ 17 мая 2018

Если вы хотите фильтровать рабочие заказы, поступающие с сервера, с помощью фильтра rxjs, вам нужно будет превратить массив рабочих заказов в наблюдаемые рабочие заказы, например.

export class BackendServices {
    private BASE_URL ='http://localhost:3000/backend';
    constructor(private http: HttpClient) {}

    getWorkOrders(){
        return this.http.get(this.BASE_URL + '/getworkorders/')
                   .pipe(map((data) => Observable.from(data));
    }
}

private woSubject = new BehaviorSubject<IWorkOrders[]>([]);
    getWorkOrders() {
        this.bs.getWorkOrders()
          .pipe(
              filter(data => data.timestamp > 123456786 ),
              toArray()
           )
          .subscribe((data: any) =>
               this.woSubject.next(data),
           );
        }

Альтернативой является фильтрация массива на карте с использованием стандартного фильтра массива, например.

export class BackendServices {
    private BASE_URL ='http://localhost:3000/backend';
    constructor(private http: HttpClient) {}

    getWorkOrders(){
        return this.http.get(this.BASE_URL + '/getworkorders/');
    }
}

private woSubject = new BehaviorSubject<IWorkOrders[]>([]);
    getWorkOrders() {
        this.bs.getWorkOrders()
          .pipe(map(data => data.filter(workorder => workrder.timestamp > 123456786) )
          .subscribe((data: any) =>
               this.woSubject.next(data),
           );
        }

Один вопрос, который я хотел бы задать, заключается в том, почему вы выдвигаете результатнаблюдаемая подписка на предмет поведения?Как правило, если вы помещаете результаты из подписки в другую наблюдаемую, вы можете достичь того же, комбинируя наблюдаемые вместо

...