Поведение субъекта не ведет себя должным образом? - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь следовать примеру таблицы данных, но у меня есть одна проблема, когда я пытаюсь реализовать свой источник данных. Последняя подписка говорит мне, что мне нужно иметь тип данных any в моем предмете поведения, когда я уже объявил тип как любой.

А вот служба информации о самолете:

import { Aircraft } from '../shared/aircraft';
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';


@Injectable({
  providedIn: 'root'
})
export class AircraftInfoService {
  aircraft: Aircraft[];
  getApi = 'https://<domainRemoved>/api/PApps_AircraftInfo?<keyRemove>';

  constructor(private httpClient: HttpClient) { 

  }

  ngOnInit() {
    console.log('aircraftInfoservice');
  }

  getAircraft() {
    return this.httpClient.get(this.getApi)
  }
}

Вот код источника данных:

import { Aircraft } from '../shared/aircraft';
import { AircraftInfoService } from './aircraft-info.service';
import { BehaviorSubject } from 'rxjs';
import { CollectionViewer, DataSource } from '@angular/cdk/collections';
import { Observable } from 'rxjs';
import { of } from 'rxjs';
import { catchError, finalize } from 'rxjs/operators';

export class allAircraftInfoDataSource implements DataSource<Aircraft> {

  private aircraftDBSubject = new BehaviorSubject<any[]>([]);
  private loadingSubject = new BehaviorSubject<boolean>(false);

  public loading$ = this.loadingSubject.asObservable();

  constructor(private aircraftInfoService: AircraftInfoService) {}

  connect(collectionViewer: CollectionViewer): Observable<Aircraft[]> {
      return this.aircraftDBSubject.asObservable();
  }

  disconnect(collectionViewer: CollectionViewer): void {
      this.aircraftDBSubject.complete();
      this.loadingSubject.complete();
  }

  getAircraft() {

      this.loadingSubject.next(true);

      this.aircraftInfoService.getAircraft().pipe(
        catchError(() => of([])),
        finalize(() => this.loadingSubject.next(false))
      )
      .subscribe(data => this.aircraftDBSubject.next(data));      
  }    
}

.next (данные) дает мне ошибку:

ОШИБКА в ../../src/app/services/aircraft-info-datasource.service.ts(36,56): ошибка TS2345: Аргумент типа 'Объект | any [] 'нельзя назначить параметру типа' any [] '. Тип «Объект» назначается очень немногим другим типам. Вы хотели использовать вместо этого любой тип? Типу «Объект» не хватает следующих свойств типа «любой []»: длина, поп, толчок, конкат и еще 26.

Редактирование вопроса и включение дополнительной информации. Информация о самолете - это то, где содержится вызов getAircraft. Он возвращает httpclient get, поэтому отсюда и тип требования any. Так как это HTTP-вызов, я не могу напечатать это, я могу? Если я пытаюсь, это дает мне ошибки. Есть ли возможность привести значение в машинописи так же, как в 'C'?

Спасибо ....

Ответы [ 2 ]

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

Понял, что мне нужно набрать возврат от http get в моем вызове подписки.Теперь есть .subscribe ((data: any []) => this.aircraftDBSubject.next (data));и все работает как шарм.WooHoo!

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

Если ожидался тип any, то действительно вы могли бы передать все что угодно. Но здесь any[] требуется. Так что это массив. Объекты внутри могут быть любыми, но все же необходимо, чтобы весь объект был массивом. Поскольку передаваемый объект может иметь тип any[] или Object, нет гарантии, что он всегда является массивом.

Скорее всего, исправление заключается в работе с лучше определенными типами, например, Observable<Aircraft[]> вместо Observable<any[]>.

...