2016-05-07 7 views
0

Ich arbeite an einer Angular2 App und dies funktionierte gut, bis RC1 herauskam (obwohl es nie in RC0 getestet wurde).Angular2 RC1 Service verliert initiierte Eigenschaften

Im Wesentlichen habe ich eine CacheService-Klasse, Subskribenten Subskriptionen in einer 'remoteService' Klasse. Alle Komponenten beziehen sich auf die cacheService.player, anstatt die Anforderung an den remoteService zu stellen. Ich tue dies, weil es auch den Anwendungs-Caching-Layer vom remoteService entkoppelt, so dass der cacheService zwischengespeichert werden kann und der remoteService auf den Remote-Service zugreifen kann.

Wenn die Komponente jedoch instanziiert wird, wird der cacheService-Konstruktor aufgerufen, der das Array players [] initialisiert.

Wenn der remoteService jedoch einen Player ausgibt, kann die Funktion innerhalb des Abonnements nicht auf das Array players [] zugreifen - es ist nicht initialisiert.

Auch dies funktionierte in der Beta, aber nicht in RC.

Fehle ich etwas?

Der Caching-Dienst (vereinfacht)

@Injectable() 
export class cacheService { 
    public players: any[]; 

    constructor(private _service: remoteService) { 
      this.players = []; 

      _service.players.subscribe((p: player) => { 
       if (this.players[p.id] && this.players[p.id].score) 
        p.score = this.players[p.id].score; 

       this.players[p.id] = p; 
      }); 
    } 
} 

Die Komponente (wieder vereinfachter)

@Component({ 
    selector: 'player-view', 
    templateUrl: '/Template/PlayerView' 
}) 
export class PlayerView implements OnInit { 
    public playerCache = any[]; 

    constructor(private _cacheService: cacheService) { 
     this.playerCache = []; 
    } 

    getDraftData() { 
      this._cacheService.getPlayers(league.id); 
      this.playerCache = this._cacheService.players; 
     } 
    } 

    ngOnInit() { 
     this.getDraftData(); 
    } 
} 

Edit: korrigierte Transkriptions Fehler.

+0

Schwer zu sagen von dem Code, den Sie gepostet haben. Wie sieht 'getPlayers() 'aus? Was ist die genaue Fehlermeldung, die Sie erhalten? –

+0

Der Fehler tritt tatsächlich auf, wenn versucht wird, auf eine Eigenschaft des this.players [] - Arrays zuzugreifen (z. B. this.players [p.id] .score). Die Fehlermeldung lautet "Kann den Eigenschaftswert von undefined nicht lesen". –

+0

Das Problem liegt offensichtlich bei Ihren Daten. Überprüfen Sie, ob die Daten tatsächlich in '_service.players.subscribe (...)' gesetzt sind, bevor Sie darauf zugreifen. "Beobachtbar" ist asynchron. Nur weil Sie es abonniert haben, heißt das nicht, dass Sie sofort einen Wert erhalten. Der Wert kann eventuell eingestellt werden, aber es ist definitiv nicht sofort. –

Antwort

0

Diese Zeile ist ungültig

this.playerCache = this._dataService.players; 

Der Service Referenz this._cacheService ist. Es gibt keine this._dataService. dataService (immer noch anders - keine _) ist der Typ this._cacheService

+0

Sie haben Recht, das war eigentlich ein Übertragungsfehler, als ich den Code vereinfacht habe. Ich habe das Snippet entsprechend aktualisiert. –

0

Ich habe das Problem gefunden. Ich hatte eine Zeile, die auf die Eigenschaft des Player-Arrays zugreift, ohne überprüft zu werden.

Zum Beispiel:

if (this.players[p.id]) 
    temp = this.players[p.id].score 

this.players[p.id].score = temp 

Das Problem entstand, als die Spieler [p.id] instanziierte wurde.

Verwandte Themen