2016-04-29 15 views
5

Ho un paio di cicli * ngFor a seconda degli iterabili che potrebbero non essere ancora istanziati. (per esempio stanno aspettando un osservabile)angular 2 * ngPer, quando l'iterabile non è stato ancora istanziato

c'è qualche espressione come questa che potrei usare nella vista?

UPDATE: Ecco il thats parte errore

gettando

Componente

activeLectureContent:LectureContent; 

View

<div class="filter-units"> 
    <div>Units</div> 
    <a (click)="setUnit(i)" class="btn btn-icon-only blue filter-unit-btn" *ngFor="#unit of activeLectureContent.content; #i = index"> 
     <span>{{i+1}}</span> 
    </a> 
    </div> 

Impossibile leggere proprietà 'content' di indefinito in [null]

Lecture Content sembra questo

export class LectureContent{ 
    constructor(
    public name:string = '', 
    public filter:LectureFilter[]=[], 
    public show:boolean = true, 
    public hover:boolean = false, 
    public content:any[]=[] 
){} 
} 

applausi

+0

Provoca un errore? Spesso, non devi fare nulla se l'iterabile non esiste ancora. –

+0

sì, che iterable contiene oggetti di grandi dimensioni e gli elementi all'interno di quel div devono accedere a quelli –

risposta

3

Se è "semplicemente" un iterabile (array, ... ma non osservabile, promessa), penso che non ci sia nulla da fare. ngFor controllerà gli aggiornamenti del iterabile. Quando il valore diventerà non nullo, ngFor aggiornerà il contenuto corrispondente:

Vedi questo esempio:

@Component({ 
    selector: 'app' 
    template: ` 
    <div> 
     <div *ngFor="#category of categories;#i=index">{{i}} - {{category.name}}</div> 
    </div> 
    ` 
}) 
export class App { 
    constructor() { 
    Observable.create((observer) => { 
     setTimeout(() => { 
     observer.next(); 
     }, 2000); 
    }).subscribe(() => { 
     this.categories = [ 
     { name: 'Cat1', value: 'cat1' }, 
     { name: 'Cat2', value: 'cat2' }, 
     { name: 'Cat3', value: 'cat3' }, 
     { name: 'Cat4', value: 'cat4' } 
     ]; 
    }); 
    } 
} 

Vedere questo plunkr: https://plnkr.co/edit/J1aVclVcjJPqm1Qx9j0j?p=preview.

Con beta 17, è necessario sostituire # da let:

<div *ngFor="let category of categories;let i=index">{{i}} - (...) 

Non sembra bene che ngIf con ngFor opere. Vedi thisp plunkr: https://plnkr.co/edit/aE3umzzSZ5U9BocEE9l6?p=preview

Se "iterable" è un osservabile o una promessa, que la pipe async.

Modifica

Si potrebbe provare qualcosa di simile:

<template [ngIf]=" activeLectureContent "> 
    <a (click)="setUnit(i)" class="btn btn-icon-only blue filter-unit-btn" *ngFor="#unit of activeLectureContent.content; #i = index"> 
     <span>{{i+1}}</span> 
    </a> 
</template> 

Io uso la sintassi estesa per ngIf dal ngFor e ngIf non possono essere utilizzati sullo stesso elemento.

+0

Ciao Thierry, ho aggiornato la mia domanda. Forse il mio iterable non è davvero un iterable semplice? Perché è una matrice all'interno di un oggetto che non è stato ancora istanziato? Se ti faccio correggere, ngFor non lancia un errore se è collegato direttamente a un iterabile? –

+0

Ehi! È necessario verificare che activeLectureContent non sia indefinito. Ho aggiornato la mia risposta. Forse si potrebbe usare l'operatore Elvis: "activeLectureContent? .content". Ma non so se funziona in questo caso (ngFor). –

+0

GRAZIE! Elvis è davvero al sicuro loro giorno;) –

3

Si potrebbe usare una direttiva ngIf, quindi è resa solo se iterable è thruthy.

<div *ngIf="iterable" *ngFor="let item of iterable"><div> 
+0

Ciao! grazie per la risposta, ho aggiornato la mia domanda perché penso di essere in loop non direttamente su un iterabile ma piuttosto è una matrice all'interno di un oggetto che non è stato istanziato. –

1

Stai cercando AsyncPipe:

<div *ngFor="#item of iterable | async"></div> 

Funziona con osservabili, Promesse e EventEmitters. È possibile ottenere ulteriori informazioni su di esso nel guide (capitolo "L'impuro AsyncPipe") e documentation.

+0

Ciao! grazie per la risposta, ho aggiornato la mia domanda perché penso di essere in loop non direttamente su un iterabile ma piuttosto è una matrice all'interno di un oggetto che non è stato istanziato. –

3

Resuscitare questo post come ho avuto di recente questa stessa domanda.

Questa è una custodia perfetta per Angular (safe navigation operator).

Dalla documentazione: (?.)

L'angolare operatore di navigazione sicura è un modo fluente e conveniente per evitare valori nulli e non definiti nei percorsi di proprietà.

Così la vista ad esempio dalla domanda sarebbe:

<div class="filter-units"> 
    <div>Units</div> 
    <a (click)="setUnit(i)" class="btn btn-icon-only blue filter-unit-btn" 
     *ngFor="let unit of activeLectureContent?.content; let i = index"> 
     <span>{{i+1}}</span> 
    </a> 
    </div> 

Aggiunta del? dopo activeLectureContent significa che ngFor verrà ignorato se activeLectureContent è nullo o indefinito.