2017-08-31 86 views
0

我是新的离子和角度。我想从API获取数据,但无法访问数据。无法访问来自API的数据

这里是我的代码

public items: any; 

    constructor(
    public navCtrl: NavController, 
    public modalCtrl: ModalController, 
    public navParams: NavParams, 
    public http: Http) { 

    let headersToken = new Headers(); 
    headersToken.append('Authorization', 'Bearer token here'); 

    this.http.get('http://localhost:8000/api/data',{headers : headersToken}).map(res => res.json()).subscribe(data => { 
      this.items = data; 
     }); 

    }  

    ionViewDidLoad(){ 
    console.log(this.items); 
    } 

IonViewDidLoad的结果是不确定的。

回答

0

当您调用IonViewDiDLoad时,您的HTTP调用可能没有完成。尝试设置超时并查看它是否有效。否则,它可能是你的HTTP请求没有返回正确的数据

+0

但是如果我把console.log(items)放在this.items = data之后,数据就完美地显示出来 – reeouw

+0

是的,这是因为如果数据是从订阅中发出的,那么只会输入代码的那一部分。如果您希望在获取数据后尽快打印数据,则此功能可行。 – user7722867

0

你可以这样说:

注:由于async性质,你需要做的,如下图所示。

ionViewDidLoad(){ 
    let headersToken = new Headers(); 
    headersToken.append('Authorization', 'Bearer token here'); 

    this.http.get('http://localhost:8000/api/data',{headers : headersToken}).map(res => res.json()).subscribe(data => { 
      this.items = data; 
      console.log(this.items); 
     }); 

    } 
0

你需要明白为什么会发生这种情况。

Http.get是一个异步调用。

您写下代码的方式是在您收到来自http呼叫的输出或呼叫完成之前执行您的代码console.log(this.items);

为了确保您在调用后获取数据,您需要将控制台放入订阅中。

下面console.log(this.items)我已经加入内部认购

 this.http.get('http://localhost:8000/api/data',{headers : headersToken}) 
.map(res => res.json()) 
.subscribe(data => this.items = data, // 1st param where you get data 
      (error) => console.log(error), // error if any 
      () => conosle.log("call is finished"+this.items) // call is completed. here you call ionViewDidLoad() as well. 
      ); 

     }  

     ionViewDidLoad(){ 
     console.log(this.items); 
     } 

我希望这有助于。