2016-11-02 11 views
1

Когда мое приложение запускается первым, я хочу, чтобы player.service сделал запрос HTTP и сохранил данные в качестве переменной в моей службе для доступа к моим компонентам. Моя служба делает запрос очень точным, и данные сохраняются, но мое представление никогда не обновляется.Угловая привязка данных 2

В моем playerlist.component Я вставляю службу, чтобы иметь доступ к переменной, но я не могу получить данные. Я думаю, это потому, что мне нужно сделать все это, чтобы это произошло.

Все, что я хочу, это мой список, который, по моему мнению, заполняется, когда страница загружается и имеет, и убедитесь, что все мои будущие компоненты имеют доступ к одному источнику данных для предотвращения нескольких HTTP-запросов.

В моем app.component я включил player.service и поместил его в поставщиков ... если это имеет значение.

player.service

import { Injectable } from '@angular/core'; 
import { Http } from '@angular/http'; 
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/Rx'; 

@Injectable() 
export class PlayerListService { 

    public playerListData; 

    constructor(private http:Http) { 
     this.getPlayerData().subscribe(
      data => this.playerListData = data 
     ); 
    } 

    getPlayerData =():Observable<any> => { 
     return this.http.get('my-api').map(response => response.json()) 
    } 
} 

playerlist-компонент

import { Component, OnInit } from '@angular/core'; 
import { PlayerListService } from '../shared/index'; 

@Component({ 
    selector: 'app-player-list', 
    templateUrl: './player-list.component.html', 
    styleUrls: ['./player-list.component.scss'] 
}) 
export class PlayerListComponent implements OnInit { 

    public playerList; 

    constructor(private playerListService:PlayerListService) {} 

    ngOnInit() { 
     this.playerList = this.playerListService.playerListData; 
    } 
} 

ответ

1

Проблема заключается в том что ваши данные не извлекаются еще, когда компоненты OnInit работает игровая.

Что вы можете сделать, это вернуть Наблюдаемый из вашего playerListData и подписаться на это Наблюдаемое, чтобы получить фактическое значение.

сервис

public playerListData: Subject<any> = new Subject<any>(); 

constructor(private http:Http) { 
    this.getPlayerData().subscribe(
     data => this.playerListData.next(data) 
    ); 
} 

компонент

В компоненте можно либо просто использовать async трубу в шаблоне

{{ playerListService.playerListData | async }} 

или

ngOnInit() { 
    this.playerListService.playerListData 
     .subscribe(data => this.playerList = data); 
} 
+0

Я попробовал ваше предложение и я получаю сообщение об ошибке: 'Не удается найти отличаться поддерживающий объект «Объект объекта» типа «объект». NgFor поддерживает только привязку к Iterables, например, Arrays. 'Я помещаю' console.log() 'сразу после следующего (данных), и я могу видеть свои данные, поэтому я предполагаю, что проблема заключается в компоненте' .subscribe () '? – Mike

+0

Я просто прокомментировал '.subscribe()' и не получаю ошибку. Таким образом, проблема может быть там. – Mike

+0

Я не знаю структуру данных, которые поступают из http-вызова, поэтому я не могу вам помочь. Если вы используете асинхронный канал, вам не нужна подписка. –

0

вы получили ошибку здесь вы не выбираете поставщика этой услуги

@Component({ 
selector: 'app-player-list', 
templateUrl: './player-list.component.html', 
styleUrls: ['./player-list.component.scss'], 
providers: [PlayerListService] //<--- add this line on your component 

})

+0

Так вы идете ТОЛЬКО, ЕСЛИ служба используется компонентом ONE, или если вы хотите иметь несколько экземпляров службы.Но в большинстве случаев услуги используются для обмена данными по нескольким компонентам и для связи между ними. В таком случае объявление 'провайдеров' принадлежит модулю. –