2016-02-18 4 views
4

Я пытаюсь получить данные из веб-сервиса (результат JSON) и отобразить его в компоненте Angular 2 с помощью *ngFor. Вот мои Datas:Http get + NgFor

{ 
    "Columns": [ 
    {"Label": "CodeProduct"}, 
    {"Label": "productfamily_ID"}, 
    {"Label": "description"} 
    ] 
} 

А вот мой Угловой компонент:

import {Component, View} from 'angular2/core'; 
import {Http, Response} from 'angular2/http'; 
import 'rxjs/add/operator/map'; 

@Component({ 
    selector: 'app', 
    templateUrl: './app/app.html' 
}) 
export class AppComponent 
{ 
    columns: Array<Object> = []; 

    constructor(private http: Http){} 

    ngOnInit() { 
     this.getProducts() 
      .subscribe(
      (columnRemote: Array<Object>) => { this.columns = columnRemote}); 
    }; 

    private _url = 'api/data/product'; 

    getProducts() { 
     return this.http.get(this._url) 
      .map((res) => res.json().Columns); 
    } 
} 

И мой шаблон:

<h3>Hello StackOverFlow</h3> 

<ul> 
    <li *ngFor="#column of columns">{{column.Label}}</li> 
</ul> 

Я вижу, что появляется название, но не список мои столбцы (даже если я попробую статическую строку, например «Тест» внутри <li>). Если я заполню свой массив статическими значениями в конструкторе, я увижу, как отображается массив. В Debuger я могу видеть, что Datas правильно восстановлена, но в этой строке:

.subscribe((columnRemote: Array<Object>) => { this.columns = columnRemote}); 

переменная это имеет тип Абонента и не типа AppComponent. Это нормально? Я сделал это неправильно? Я работаю с Angular2 beta6 с ES5 TypeScript.

EDIT 1: Вот что Debuger показать мне для res.json()

enter image description here

+0

Из приведенного выше кода, я думаю, что вы получаете объект, но вы рассматриваете как array.try '

  • ...
  • ' –

    +0

    Я рассматриваю как массив, потому что я возвращаю массив столбцов в функции .map: '.map ((res) => res.json(). Columns);' –

    +1

    получил проблемы bro..working on it –

    ответ

    1

    Чтобы быть в состоянии позволить угловую знать, когда, чтобы обновить данные, добавьте angular2-polyfills.js к вашему index.html, потому что это будет включать в себя zone.js

    (thanks @lucacox)

    При правильном порядке добавления е библиотеки является:

    es6-shim.min.js

    system-polyfills.js

    angular2-polyfills.js

    system.src.js

    Rx.js

    angular2.dev.js

    Имейте в виду, что необходимые библиотеки могут меняться со временем по мере созревания углов2. Всегда проверяйте руководство quickstart при обновлении до более новой версии углового2.

    +0

    Nice! Еще один вопрос: почему 'system-polyfills.js' и' es6-shim.min.js'? –

    +1

    Это полиполки Internet Explorer. IE требует, чтобы полиполки запускали приложение, основанное на обещаниях ES2015 и динамической загрузке модуля. Где 'es6-shim' поставляет обещания ES2015, а' system-polyfills' загружает динамический модуль – PierreDuc