2017-01-09 5 views
1

У меня есть компонент Angular2, отображающий некоторые данные в таблице.Angular2 async вложенные данные

export class DiagnosisComponent { 

    headers: Array<String> = ["hello world", "hello world"]; 
    table: Observable<TableData>; 

    constructor(private eventService: EventService) { 
    this.table = this.eventService.getDiagnosisEvents(); 
    this.table.subscribe(console.log.bind(console)); 
    } 

} 

А вот класс TableData

export class TableData { 

    content: Array<any>; 
    paging: Paging; 

    constructor(obj: any) { 

    this.paging = { 
     size: obj.size, 
     totalElements: obj.totalElements, 
     currentPage: 1 
    }; 

    this.content = obj.content; 

    } 

} 

export interface Paging { 
    size: number; 
    totalElements: number; 
    currentPage: number; 
} 

Теперь я хочу, чтобы связать table.content массив к * ngFor с асинхронным трубой. Моя проблема в том, что мне нужно получить вложенные данные, а не сами TableData.

<div class="row"> 

    <vpscout-filter></vpscout-filter> 

    <table class="table"> 
    <thead> 
    <tr><th *ngFor="let header of headers">{{header | translate}}</th></tr> 
    </thead> 
    <tbody> 
    <tr *ngFor="let row of table | async "> 
     <td>test</td> 
    </tr> 
    </tbody> 
    </table> 

</div> 

Изменение * ngFor к <tr *ngFor="let row of table.content | async "> не работает.

+2

Не должно быть 'let row (table | async) .content'? – jonrsharpe

+1

@jonrsharpe вы должны действительно предоставить их в качестве ответа (я могу понять, что вам больше не нужны очки, но все еще ..: P). Это определенно решение http://stackoverflow.com/a/35302622/5706293 – echonax

ответ

6

я решил аналогичную проблему так:

<tr *ngFor="let row of (table | async)?.content "> 
     <td>test</td> 
</tr> 

Поскольку я использую immutableJs для моего проекта и преобразования наблюдаемых данных на карту, точное решение, которое работало для меня было:

<tr *ngFor="let row of (table | async)?.get('content') "> 
     <td>test</td> 
</tr> 
+0

Да, отлично, спасибо и @jonrsharpe, но я должен добавить? иначе «content» имеет значение null до первого следующего() – Pascal

1

Вы можете создать новое поле для содержания:

this.table.subscribe((data)=>{ 
    this.tableContent = data.content 
}); 

и связать это новое поле для *ngFor

<tbody *ngIf="tableContent"> 
    <tr *ngFor="let row of tableContent"> 
     <td>test</td> 
    </tr> 
</tbody> 
0

table имеет тип Observable и не является экземпляром класса TableData. Вам необходимо использовать метод Observable subscribe для назначения экземпляра TableData переменной, привязанной к шаблону/представлению.

Смежные вопросы