Angular ,在获得 promise 值后无法访问另一个函数中的值

标签 angular typescript

我有一个表单,想在显示后向表单字段添加默认值,所以基本上我有 2 个函数 #1 用于从后端检索数据 #2 显示表单:

person$: any;

ngOnInit() {
  this.getPersonData(123)
  this.buildPersonForm()
}

getPersonData(id: number) {
   this.personService.getDetails(id)
     .subscribe((data) => {
       this.person$ = data
     }
}

buildPersonForm() {

  // Here I want to access this.person$.firstname

  console.log(this.person$.firstname) // undefined
  this.PersonForm = this.fb.group({
     firstname: [null, Validators.required],
  })
}

在 html 模板中,如果我按如下方式使用它,它会起作用:

<input matInput placeholder="Firstname" formControlName="firstname" value="{{person$?.firstname}}">

但我想知道如何在组件内部而不是在 html 模板中访问它。

Angular CLI: 7.0.2
Node: 10.12.0
OS: darwin x64
Angular:
...

Package                      Version
------------------------------------------------------
@angular-devkit/architect    0.10.2
@angular-devkit/core         7.0.2
@angular-devkit/schematics   7.0.2
@schematics/angular          7.0.2
@schematics/update           0.10.2
rxjs                         6.3.3
typescript                   3.1.3

最佳答案

只需在 getPersonData 可观察完成时调用 buildPersonForm

ngOnInit() {
  this.getPersonData(123);
}

getPersonData(id: number) {
   this.personService.getDetails(id)
     .subscribe((data) => {
        this.person$ = data
      },
     null,
      () => this.buildPersonForm()
    }

另一种方式只是 buildPersonForm 在 subscribe 的 next 方法体中

ngOnInit() {
  this.getPersonData(123);
}

getPersonData(id: number) {
   this.personService.getDetails(id)
     .subscribe((data) => {
       this.person$ = data;
       this.buildPersonForm();
     }
}

您可以使用async/await的最后一种方式

async ngOnInit() {
  this.person$ = await this.getPersonData(123).toPromise();
  this.buildPersonForm();
}

关于 Angular ,在获得 promise 值后无法访问另一个函数中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53665070/

相关文章:

javascript - 我怎样才能绘制出我的可观察到的响应

javascript - 如何将 Kotlin 编译成 TypeScript?

javascript - Ionic 2 Tabs 超出最大调用堆栈大小

css - ionic ionic 文本换行 : remove elipsis and go to next line for label

javascript - 使用 InjectionToken 进行注入(inject)?

css - 模态上的 Angular5 PrimeNG 数据表,上下文菜单显示在模态后面

Angular 6路由重定向

javascript - 在 angular2 应用程序中加载 JavaScript 文件

angular - 类型 '{}' 不可分配给类型 '{ title: string; text: string; }'

facebook-graph-api - 如何从 Angular2 服务访问 FB global?