我是Angular 2和打字稿的新手。
这是我的跟踪组件,我从api跟踪。
A
在这些行中
private releasedTrack:string = moment(“2013-03-10T02:00:00Z”)。format('DD-MM-YYYY'); private duration:string = moment(345678).format(“m:ss”);
我想传递{this.track}而不是硬编码值。
This.track未定义,(因为它不可用)
我怎样才能实现这一目标?
由于
答案 0 :(得分:1)
this.track
似乎是在ngOnInit()中初始化的。在我看来,解决方案只是在ngOninit()初始化后传递this.track
。我假设以下列方式:
this.trackService.getAll().subscribe(
(data) => this.track = data[TrackId],
(error) => this.error = error,
() => this.isLoading = false,
() => this.track //it should now have value different from undefined
);
希望这会有所帮助:)
编辑:
为了进一步解释,您的releasedTrack变量的初始化发生在ngOnInit()之前,即在应用程序完全加载之前。最重要的是,您正在调用服务this.trackService.getAll()
,它返回一个承诺。这意味着该方法将异步执行,并不保证它将在执行之后的行之前完成。例如:
this.trackService.getAll().subscribe(
...
)
this.track; // this might be undefined, since this.trackService.getAll() might not have finished
这就是为什么你使用.subscribe方法来定义.getAll()方法完成后要执行的函数。也就是说,您以(variable) => action
格式定义所谓的箭头函数,其中variable是先前执行的函数的返回值。
答案 1 :(得分:1)
所以我想到了在observable完成后如何使用oncomplete。 subscribe函数有三个参数: onNext onerror的 onCompleted
我改写了这个:
public getDuration(){
return moment(this.track.trackTimeMillis).format("mm:ss");
}
public getReleaseDate(){
return moment(this.track.releaseDate).format("DD-MM-YYYY");
}
ngOnInit(): void {
let TrackId = this.route.snapshot.params['trackId'];
this.trackService.get(TrackId).subscribe(
(data) => this.track = data,
(error) => this.error = error,
() => { this.duration = this.getDuration(),
this.releasedDate = this.getReleaseDate(),
this.isLoading =false},
);
this.chooseRandomTracks();
}
它有效!
答案 2 :(得分:0)
如果您计划将数据从一个observable发送到另一个
,请尝试使用flatMap运算符