【问题标题】:Returning data to subscribe from observable in angular返回数据以订阅角度的可观察对象
【发布时间】:2017-07-19 19:11:03
【问题描述】:

我正在尝试将数据返回到我的组件,然后使用来自服务的数据作为参数来触发路由。我认为我错误地使用了 observables,如果数据可以返回给订阅,或者我是否应该触发服务提供商的路由,我会感到困惑。从服务提供商触发路由的问题在于 extractData 内部的范围发生了变化。我可以从 extractData() 中访问 this.router 吗?组件在提交表单时设置如下:

更新:

组件:

private dataFromServer: ShortFormModel;
onSubmit(shortForm: any) {
    if (!shortForm) { return; }
    const formModel = this.shortForm.value;
    this.shortFormService.create(formModel)
    .subscribe(body => { this.dataFromServer = body; console.log(body) })
  }) 
 }

服务提供商:

create(shortForm: any): Observable<ShortFormModel> {
 let headers = new Headers({'Content-Type': 'application/json'});
 let options = new RequestOptions({headers: headers});

 return this.http.post(this.preCheckUrl, shortForm, options)
  .map((res) => this.extractData(res))
  .catch(
  (error: any): Promise<any>=> {
    this.router.navigate(['/error', error]);
    return Promise.reject(error.message || error);
  }
 )
}

private extractData(res: Response) {
  let body = res.json();
  this.router.navigate(['/apply', body.appId])
  return body|| { };
}

响应负载:

{  
  "offer":{  
   "id":null,
   "amount":null,
},
"dupes":true,
"appId":53
}

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    你确实是对的,当使用时

    .map(this.extractData)
    

    范围在extractData 内部发生变化。您必须将对 this.extractData 的调用包装在 lambda/fat-arrow 函数中以保留作用域,如下所示:

    .map((res) => this.extractData(res))
    

    【讨论】:

    • 完美,可行!至于我问题的另一部分,我将如何将数据返回给组件?现在,我似乎可以访问响应的唯一方法是从 extractData。
    • 您可以从订阅方法的成功回调内部的可观察对象“内部”访问数据,如下所示:` .subscribe(res => { this.componentProperty = res; this.router.navigate (['/apply', res]) })`
    • 这是有道理的,但是,订阅中的“res”只是一个空对象,即使它们是响应。请参阅上面的更新实现。
    • 好的,使用该有效负载,您需要访问有效负载,例如:this.router.navigate(['/apply', body.appId])return body || { };(在 extractData() 内部)
    • 谢谢 ;) 你只需要从 extractData 返回 body,而不是 body.data
    猜你喜欢
    • 2018-03-27
    • 2020-12-10
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多