Angular 属性在ngOnInit()之外的subscribe to get方法的组件中未定义

Angular 属性在ngOnInit()之外的subscribe to get方法的组件中未定义,angular,subscribe,Angular,Subscribe,我在注释中提到过,当我在ngOnInit中使用控制台记录所选属性时,它确实会控制台对象,但是在该块之外,当我控制台该属性时,它是未定义的。你能告诉我如何使它工作吗。。或任何其他解决方案 import { Product } from './../../Models/ProductModel'; import { Component, OnInit } from '@angular/core'; // import { Subscription } fr

我在注释中提到过,当我在
ngOnInit
中使用控制台记录所选属性时,它确实会控制台对象,但是在该块之外,当我控制台该属性时,它是未定义的。你能告诉我如何使它工作吗。。或任何其他解决方案

      import { Product } from './../../Models/ProductModel';
        import { Component, OnInit } from '@angular/core';
        // import { Subscription } from "rxjs/Rx";
        import 'rxjs';
        import { Router, ActivatedRoute } from '@angular/router';
        import { ProductService } from 'app/products/product.service';
        @Component({
          selector: 'app-product-detail',
          templateUrl: './product-detail.component.html',
          styleUrls: ['./product-detail.component.css']
        })
        export class ProductDetailComponent implements OnInit {
          public selectedProduct: Product;
          private productIndex: string;
          // private subscription: Subscription;

          constructor(private router: Router,
                      private route: ActivatedRoute,
                      private PService: ProductService) { }

          ngOnInit() {

             this.route.params.subscribe(
              (params: any) => {
                this.productIndex = params['id'];

         }
            );


                this.PService.getProduct(this.productIndex).subscribe((data: any) =>{
                 // return the object
                 console.log(data.product)

               return this.selectedProduct = data.product,
                 //output the here object
                 console.log(this.selectedProduct);

        }

                );

        // output undefined 
                console.log(this.selectedProduct);


          }







this is the getProduct method in my service

    getProduct(id:string){
    const headers = new Headers({ 'Content-Type': 'application/json' });
      return this.http.get('http://localhost:3000/products/'+id, { headers : headers})
      .map((response: Response) => response.json())
      .catch( (error: any) =>
      {

        this.ErS.getError(error.json());
        return Observable.throw(error);
      })



    }

我假设此代码的目的是在每次路由参数更改时重新设置数据?如果这是正确的,那么getProduct调用需要在subscribe方法中

像这样:

     ngOnInit() {

         this.route.params.subscribe(
          (params: any) => {
             this.productIndex = params['id'];

             this.PService.getProduct(this.productIndex).subscribe((data: any) =>{
             // return the object
             console.log(data.product)

             return this.selectedProduct = data.product,
             //output the here object
             console.log(this.selectedProduct);
            });
     });

           // output undefined 
            console.log(this.selectedProduct);
   }
最后一个console.log将显示未定义的,因为它是在组件初始化时和检索产品之前执行的

以下是正在发生的事情:

  • 组件已初始化并在其上运行
  • 该参数已订阅
  • 底部的控制台日志尝试显示所选的 产品和没有。。。如此未定义
  • 将处理参数中的更改,并在 执行
    params.subscribe()
  • 该参数从路由中获取,用于调用 获取产品
  • 订阅了从getProduct返回的可观察项
  • 稍后,从后端返回数据 服务器和
    getProduct().subscribe()中的代码是
    执行
  • getProduct().subscribe()中的两个console.log是
    执行并显示适当的产品

  • 有意义吗?

    可能重复的问题你有没有检查重复的问题和答案?它在回调之外总是未定义的。谢谢。很多……)事实上,我做的和上面一样。。没有运气你什么意思?你真正的问题是什么?