我是angular2 typescript和rxjs以及observables的新手。
我正在尝试使用此代码从api获取信息
let Alertsanswer = this.LogService.getAlertsForClient(this.userId);
var a = Alertsanswer.subscribe((response) => {
this.alerts=JSON.parse(response)
console.log(this.alerts) //give the right response.
},
error => {
var err = error;
alert(err);
}
)
你可以在订阅中看到我初始化一个私有变量:" this.alerts"
在订阅之外,此变量具有未定义的值 console.log(this.alerts)//给出undefined。
在组件doom中使用this.alert也是未定义的 这给出了一个错误:
<div>{{alerts}}</div>
第一个问题:为什么&#34;&#34;在订阅中的this.alerts为控制台提供正确的值,但外部(包括厄运)总是未定义。
第二个问题:我理解来自服务器的值是异步的,如果我有更多的代码可以在答案中继续我写它(回调),它会在订阅中吗? subscribe是什么意思? 谢谢你的帮助
答案 0 :(得分:1)
对于您的第一个问题,this.alerts
在subscribe finish
之后获取正确的值(从api获取数据),在完成之前使用this.alerts
将不会给出正确的值。您应该使用<div *ngIf="alerts">{{alerts}}</div>
来确保数据可以使用。例如,在订阅完成之前,使用<div>{{alerts.property}}</div>
将引发错误。 console.log
也是同样的原因。
对于你的第二个,请使用:
this.LogService.getAlertsForClient(this.userId)
.subscribe(response => this.alerts = JSON.parse(response),
()=>console.log('error'),
()=>yourFuncRelayOnTheResponse(this.alerts));
答案 1 :(得分:0)
嘿,你通过将服务分配给变量来做一些不稳定的事情。编辑了一些代码,向您展示我将如何定义:
export class LoginComponent
{
private alerts; //This needs to be defined here on the class first
constructor(public loginService: LoginService)
{
}
ngOnInit()
{
this.LogService
.getAlertsForClient(this.userId)
.subscribe(response =>
{
this.alerts = JSON.parse(response); // Assign response to class member alerts.
},
error=>
{
console.log(error);
})
}
}