2016-08-09 9 views
3

Ich habe eine Observable der Zeichenfolge Arrays const obs$: Observable<string[]> auf meiner Komponente als eine Eigenschaft. Während ich die async Pipe auf eine *ngIf Anweisung erfolgreich verwenden kann, schlägt die Pipe fehl, wenn über Array-Indexer (obs$ | async)[0] zugegriffen wird.Angular2: Async Rohr für Array-Index

Beispiel:

<!-- evaluates the array emmitted by obs$ for truthyness --> 
<div *ngIf="obs$ | async"> 
    <!-- only shown if obs$ emitted an array with length > 0 --> 

    <!-- but this fails with error: Cannot read property '0' of null --> 
    <img [src]="(obs$ | async)[0]"> 
</div> 

Die Instanz von obs $ in der Komponente Konstruktor gesetzt, so obs $ sollte nicht undefiniert sein, wenn die Vorlage dagetenbundenen ist.

Wie kann man auf die Elemente des Arrays in der Vorlage richtig zugreifen?

+0

arbeiten Es wurde bereits ein [Fehlerbericht] vorgelegt (https : //github.com/angular/angular/issues/10293) - Das Problem wird in RC.5 behoben. – rinukkusu

+0

Kein Duplikat an sich; Die Lösung in der Duplikatsantwort gilt nur (mit ngFor), wenn Sie über ein Array iterieren möchten; es gibt keine Lösung für den direkten Zugriff auf ein Array durch einen bekannten Index – Dyna

Antwort

0

Ich würde versuchen, den Elvis Operator auf dieser Ebene, da Ihre Daten am Anfang nicht definiert ist:

<img [src]="(obs$ | async)?[0]"> 
+0

Weder '?' noch '??' (aktueller elvis-Operator) funktionieren. Außerdem kann ich nicht sehen, warum 'obs $' undefiniert sein sollte, wenn es im * ngIf-Block verwendet wird. – Dyna

+1

Das Problem wird in RC.5 behoben - siehe [Fehlerbericht] (https://github.com/angular/ angular/issues/10293) – rinukkusu

+0

Ich habe ein Upgrade auf RC5 durchgeführt (was gestern veröffentlicht wurde) und das Problem besteht immer noch. Der elvis Betreiber? Noch kann ein einzelnes Fragezeichen für Array-Indizes verwendet werden. – Dyna

2

Dies könnte

<img [src]="(obs$ | async) ? (obs$ | async)[0] : null"> 
+0

In der Tat war ich fast sicher, dass es funktionieren würde, aber ich kam zu diesen Themen, um eine elegantere Lösung als ein ternärer Operator zu finden. Aber hey, wir können nicht immer zu viel Zeit für diese Art von Details verlieren, also werde ich das jetzt nutzen. – Alex

Verwandte Themen