【问题标题】:initialize variables inside subscribe always undefined Angular rxjs在订阅中初始化变量总是未定义的Angular rxjs
【发布时间】:2017-04-01 02:33:26
【问题描述】:

我是 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) //给出未定义的。

在组件 doom 中使用 this.alert 也是未定义的 这给出了一个错误:

<div>{{alerts}}</div>

第一个问题:为什么“”this.alerts inside subscribe 赋予控制台正确的价值,但外部(包括厄运)总是未定义。

第二个问题:我知道来自服务器的值是异步的,如果我有更多的代码可以传递答案,我将在哪里写它(回调),它会在订阅中吗? 订阅是什么意思? 感谢您的帮助

【问题讨论】:

  • @Maantu Das 你能称之为“Alertsanswer”订阅吗?我收到未定义的错误。

标签: angular rxjs


【解决方案1】:

对于您的第一个问题,this.alertssubscribe finish 之后获取正确的值(从 api 获取数据),在完成之前使用 this.alerts 不会给出正确的值。您应该使用&lt;div *ngIf="alerts"&gt;{{alerts}}&lt;/div&gt; 来确保数据可以使用。例如,在订阅完成之前,使用&lt;div&gt;{{alerts.property}}&lt;/div&gt; 将引发错误。 console.log也是同理。

第二个,使用:

this.LogService.getAlertsForClient(this.userId)
.subscribe(response => this.alerts = JSON.parse(response),
()=>console.log('error'),
()=>yourFuncRelayOnTheResponse(this.alerts)); 

【讨论】:

  • 你的回答是有道理的,但只是为了确定——你基本上说的是厄运中的 ngif 正在监听数据的变化?
  • 我的意思是使用 ngIf 来确保数据已准备好在 html 中使用,没有 ngIf 数据也会在您刷新页面时发生变化。
【解决方案2】:

嘿,您正在通过将服务分配给变量来做一些奇怪的事情。已经对您的代码进行了一些编辑,以向您展示我将如何定义事物:

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);
                })
    }
} 

【讨论】:

  • 你的代码在厄运中仍然给我未定义。是否有可能在可观察到的完成数据带来之前打印厄运?
  • 另外,api 调用是异步的,因此您的组件视图将可以访问 alerts 属性,然后再由 api 的响应填充它。在此阶段,它将是未定义的,因此会引发错误。为了解决这个问题,您必须将 ngIf 添加到任何使用 alerts 属性的标记中。 @LFJ 通过 &lt;div *ngIf="alerts"&gt;{{alert}}&lt;/div&gt; 解释了这一点
猜你喜欢
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
相关资源
最近更新 更多