我对Typescript和Web开发真的很陌生。当我订阅某个活动并且无法找到解决方案时,我发现了一件奇怪的事情。
我有一个BehaviorSubject
的服务,其中包含carId
。我有一个页面,其中有一个id列表,如果我点击一个id,那么它会调用setCarId
。到目前为止一切正常。
这是服务:
@Injectable()
export class CarService {
private carId = new BehaviorSubject("");
setCarId(carId: string) {
this.carId.next(carId);
}
getCarId(): Observable<string> {
return this.carId.asObservable();
}
我还有另一项服务,我在carId
订阅了更改。在这个我有一个汽车对象,我想从我的BehaviorSubject
中我的汽车数组中获取该汽车。我得到了我需要的汽车,我的代码中使用array.find
方法,并且它正常工作,但不是订阅。我不知道为什么,但是使用此行this.car = this.cars.find(car => car.carId == carId)
,订阅方法不会被调用,但如果没有该行,它就能正常工作。
@Injectable()
export class MyService {
subscription: Subscription;
car: Car;
cars: Array<Car>;
constructor(private carService: CarService){
this.subscription.getCarId().subscribe(carId=> {
console.log('DO SOMETHING') //
//with this row NOT working, without this row working
this.car = this.cars.find(car => car.carId == carId)
});
... //MORE CODE
我不知道为什么会这样,以及如何解决,所以请帮助我。
答案 0 :(得分:0)
我得到了解决方案。我不知道原因,但是在订阅方法中我不能使用任何数组方法,所以例如console.log(this.cars.length)也没有用,不是只是this.cars.find。但是console.log(this.cars)正确地写出了数组。无论如何,解决方案是我用这里的空数组初始化汽车数组。
cars:Array<Car>=[];
之后一切正常。如果有人可以解释我这样做的原因,那就太棒了,谢谢你们所有的帮助。 :)
答案 1 :(得分:-1)
订阅工作正常,但代码中存在一些问题。
首先,汽车列表未定义,因此无法在列表中找到汽车。
其次,你尝试在this.subscription上调用getCarId方法,但是this.discription没有那个方法,CarService就是这样。
如果您在MyService中初始化您的汽车数组,它会正常工作。
@Injectable()
export class MyService {
subscription: Subscription;
car: any;
cars: Array<any> = [{carId: "1"}, {carId: "2"}];
constructor(private carService: CarService){
this.carService.getCarId().subscribe(carId=> {
console.log('DO SOMETHING') //
//with this row NOT working, without this row working
this.car = this.cars.find(car => car.carId === carId)
});
}
}