2016-10-17 15 views
1

Я, вероятно, просто делаю глупую ошибку где-то, но я ее больше не вижу.Ионный 2 Угловой 2 получение данных REST JSON

У меня очень простое приложение Ionic 2 Angular 2. Пожалуйста, не беспокойтесь об архитектуре, я просто пытаюсь заставить ее работать в первую очередь. Я пытаюсь заполнить свой массив 'configureModules' объектами модуля, которые я получаю от службы REST JSON. Я создал кнопку, которая регистрирует массив на консоли, поэтому я могу видеть, что такое значение массива, но всегда не определено. Что я делаю не так?

export class Module { 
    type: string; 
    physicalLocationName: string; 
} 

и мой основной класс:

import { Component, OnInit } from '@angular/core'; 
import { Module } from './module'; 
import { HttpModule, Http, Response} from '@angular/http'; 
import { Observable } from 'rxjs'; 
import 'rxjs/add/operator/toPromise'; 

import { NavController } from 'ionic-angular'; 

@Component({ 
    selector: 'page-home', 
    templateUrl: 'home.html' 
}) 
export class HomePage implements OnInit{ 
    configuredModules: Module[]; 
    http: Http; 

    constructor(public navCtrl: NavController,private _http: Http) { 
    this.http = _http; 
    } 

    getConfiguredModules(){ 
     this.getModules() 
     .then(modules => this.configuredModules = modules); 
     console.log('finished configuredModules'); 
    } 

    getModules(): Promise<Module[]> { 
    return  this.http.get('http://localhost:8080/rest/modules/configuredModules') 
      .toPromise() 
      .then(response => response.json().data as Module[]) 
      ; 
    } 

    ngOnInit() { 
     this.getConfiguredModules(); 
    } 

    buttonClicked(){ 
    console.log('button clicked'); 
    console.log(this.configuredModules.values); 
    } 
} 

Если я смотрю в моей сети вкладки Chrome, я вижу следующее приходить в (под ответ):

{"modules":[{"type":"myTestType","physicalLocationName":"myTestPhysicalLocation"}]} 

Я знаете, что данные поступают, но он не заполняет мой массив. Какие-либо предложения? Я думаю, что мой код выглядит идентично к Героям учебника угловых 2: https://angular.io/docs/ts/latest/tutorial/toh-pt6.html

+1

Пробовали ли вы console.log (JSON.stringify (this.configuredModules)); ? – stwissel

+1

точно, где он не определен? в событии нажатия кнопки? это должно быть 'console.log (this.configuredModules);' – micronyks

+0

Я принимаю, что массив не определен? Я также пытался зарегистрировать его без .значений, тогда я просто получаю неопределенный. Если я использую значения как в моем примере выше, он говорит: TypeError: Невозможно прочитать значения свойств «неопределенные». Что заставляет меня думать, что configureModules не определен. Я пытался использовать JSON.stringify, тот же результат: undefined –

ответ

2

Вашей ошибка в этой функции:

getModules(): Promise<Module[]> { 
    return this.http.get('http://localhost:8080/rest/modules/configuredModules') 
    .toPromise() 
    .then(response => response.json().data as Module[]); 
} 

Удалите .data после функции json() и добавить .modules вместо этого. Это то, что приходит из вашего API, поэтому он должен выглядеть следующим образом:

getModules(): Promise<Module[]> { 
    return this.http.get('http://localhost:8080/rest/modules/configuredModules') 
      .toPromise() 
      .then(response => response.json().modules as Module[]); 
    } 

Затем на кнопке щелкнул функцию, удалите values, так это выглядит следующим образом:

buttonClicked(){ 
    console.log('button clicked'); 
    console.log(this.configuredModules); 
} 
+0

Именно так! Большое спасибо Фабио! У вас есть идеи, почему учение Angular 2 (Heroes tutorial) настроено по-разному? –

+1

Потому что их API отличается от вашего. Ваш API возвращает ключ объекта с помощью '{" modules ": [{" type ":" myTestType "," physicalLocationName ":" myTestPhysicalLocation "}]}', но полезные методы API говорят нам, что мы всегда должны обертывать наши ответы API внутри объект данных, посмотрите на [это] (http://jsonapi.org/format/#document-top-level) –

+1

Большое спасибо! Вы чемпион! –

Смежные вопросы