订阅角度时无法在 ngoninit 中获得价值

Posted

技术标签:

【中文标题】订阅角度时无法在 ngoninit 中获得价值【英文标题】:Can't get value in ngoninit on subscribe angular 【发布时间】:2019-06-06 09:28:27 【问题描述】:

我不明白为什么我的对象在 Angular 上的 ngoninit 上总是“未定义”。 我在我的 api 项目上请求我得到正确的回复。 当我console.log 我的对象未定义(ngoninit)但在其他函数中我可以获得值。

我的问题是为什么以及如何在 ngoninit 中获取我的对象。

谢谢

我在邮递员上正确检索了我的回复 其他函数也检索

服务:

getById(id:string):Observable<Grower>
   return this.http.get<Grower>(`$environment.apiUrl/growers/$id`);

查看模型:

export class GrowerDetails 

    adress:string;
    zip:string;
    city:string;

组件:

  growerService:GrowerService;

  detailsProfil: GrowerDetails;

  constructor(private authenticationService: AuthenticationService, growerService:GrowerService,
    private formBuilder:FormBuilder)  
      this.growerService = growerService;
   

  ngOnInit() 
    this.detailsProfil = new GrowerDetails();

    this.growerService.getById(this.decoded.nameid).subscribe(
      (data:Grower) => this.detailsProfil = 
            adress: data.adress,
            city: data.city,
            zip : data.zip

      ,
      error => console.log(error) 
    );
console.log(this.detailsProfil); // undefinned

onSubmit()
    console.log(this.detailsProfil); // ok
 

邮递员:


    "lat": 0,
    "long": 0,
    "description": "test",
    "adress": "test",
    "zip": "test",
    "city": "test"

【问题讨论】:

How do I return the response from an Observable/http/async call in angular2?的可能重复 因为你的订阅是异步的,你可以在订阅里面进行控制台,你会看到数据 我该怎么做? (data:Grower) =&gt; this.detailsProfil = ...; console.log(...); 外部,是的,但是在 observable 回调执行之后。如果您保留两个console.log 语句,您将看到您的原始语句在订阅回调之前被调用。有关详细信息,请参阅重复的问题/答案。 【参考方案1】:

detailsProfil 的值可以在订阅内但不能在订阅外。因为 getById() 是一个 async 调用,所以在执行之前不会等待订阅完成。

进行如下更改,

 constructor(private authenticationService: AuthenticationService, growerService:GrowerService,
    private formBuilder:FormBuilder)  
      //  this.growerService = growerService;  <- this line not required
   

  ngOnInit() 
    this.detailsProfil = new GrowerDetails();

    this.growerService.getById(this.decoded.nameid).subscribe((data) => 
       console.log(data);            
       this.detailsProfil.adress = data.adress;
       this.details.city = data.city;
       this.details.zip = data.zip;
     ,
      error => console.log(error));
     console.log(this.detailsProfil); // you will get detailsProfil Object
  

编码愉快.. :)

【讨论】:

好的,它可以工作。我不知道为什么他们在文档中这样说: .subscribe((data: Config) => this.config = herosUrl: data['heroesUrl'], textfile: data['textfile'] ); 【参考方案2】:

未定义,因为您还没有数据。

     ngOnInit() 
        this.detailsProfil = new GrowerDetails();

        this.growerService.getById(this.decoded.nameid).subscribe(
          (data:Grower) => 
             this.detailsProfil = adress: data.adress,city: data.city,zip : data.zip ;

             console.log(this.detailsProfil); // you can access here because you got it now.
          ,
          error => console.log(error) 
        );

    console.log(this.detailsProfil); // you can't access here. it's still undefined 
  

【讨论】:

以上是关于订阅角度时无法在 ngoninit 中获得价值的主要内容,如果未能解决你的问题,请参考以下文章

没有 ngOnDestroy,角度取消订阅不起作用

Angular ngOnInit 如何将订阅结果用于另一个订阅/后端调用?

在 ngOnInit 函数中打开 ng-template 不起作用

组件销毁并重新访问后,订阅在 ngOnInit 函数中运行

在 angular2 中的 ngOnInit 之后,在构造函数中订阅服务

以角度 8 在表单控件中输入数量时获取总值