行为主体行为不当?
Behavior subject is not behaving properly?
我正在尝试按照那里的数据 table 示例进行操作,但是在尝试实施我的数据源时遇到了一个问题。最后的订阅告诉我,当我已经将类型声明为 any 时,我需要在我的行为主题中包含 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(data) 给我错误:
../../src/app/services/aircraft-info-datasource.service.ts(36,56) 中的错误:错误 TS2345:'Object | any[]' 类型的参数不可分配给参数类型 'any[]'。
'Object' 类型可分配给极少数其他类型。您是想改用 'any' 类型吗?
类型 'Object' 缺少类型 'any[]' 的以下属性:length、pop、push、concat 和另外 26 个。
正在编辑问题并包含更多信息。飞机信息服务是包含 getAircraft 调用的地方。它返回一个 httpclient get,所以这是 'any' 需求类型的来源。因为它是一个 http 调用,我不能输入它,可以吗?如果我尝试,它会给我错误。是否可以像 'C'?
那样在 typescript 中转换值
谢谢....
如果类型 any
是预期的,那么您确实可以传递任何内容。但是这里 any[]
是必需的。所以它是一个数组。里面的对象可以是任何东西,但仍然要求整个对象是一个数组。由于您传递的对象可能是 any[]
或 Object
类型,因此无法保证它始终是数组。
最有可能的修复是使用更好的指定类型,例如Observable<Aircraft[]>
而不是 Observable<any[]>
。
发现我需要在我的订阅调用中从 http get 中键入 return。现在有 .subscribe((data:any[]) => this.aircraftDBSubject.next(data));一切都像一个魅力。呜呼!
我正在尝试按照那里的数据 table 示例进行操作,但是在尝试实施我的数据源时遇到了一个问题。最后的订阅告诉我,当我已经将类型声明为 any 时,我需要在我的行为主题中包含 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(data) 给我错误:
../../src/app/services/aircraft-info-datasource.service.ts(36,56) 中的错误:错误 TS2345:'Object | any[]' 类型的参数不可分配给参数类型 'any[]'。 'Object' 类型可分配给极少数其他类型。您是想改用 'any' 类型吗? 类型 'Object' 缺少类型 'any[]' 的以下属性:length、pop、push、concat 和另外 26 个。
正在编辑问题并包含更多信息。飞机信息服务是包含 getAircraft 调用的地方。它返回一个 httpclient get,所以这是 'any' 需求类型的来源。因为它是一个 http 调用,我不能输入它,可以吗?如果我尝试,它会给我错误。是否可以像 'C'?
那样在 typescript 中转换值谢谢....
如果类型 any
是预期的,那么您确实可以传递任何内容。但是这里 any[]
是必需的。所以它是一个数组。里面的对象可以是任何东西,但仍然要求整个对象是一个数组。由于您传递的对象可能是 any[]
或 Object
类型,因此无法保证它始终是数组。
最有可能的修复是使用更好的指定类型,例如Observable<Aircraft[]>
而不是 Observable<any[]>
。
发现我需要在我的订阅调用中从 http get 中键入 return。现在有 .subscribe((data:any[]) => this.aircraftDBSubject.next(data));一切都像一个魅力。呜呼!