2016-07-08 6 views
2

Ich habe diesen Fehler:Angular 2 Wie kann ich meine Variable async auf Werte warten lassen?

TypeError: Cannot read property 'length' of undefined at PaginationComponent.ngOnChanges (pagination.component.ts:38)

Das ist mein PaginationComponent:

@Input() items = []; 
@Input('page-size') pageSize; 
@Output('page-changed') pageChanged = new EventEmitter(); 
pages: any[]; 
currentPage; 
public numberofpages = 10; 
ngOnChanges(){ 
    this.currentPage = 1; 
    var pagesCount = this.items.length/this.pageSize; 
    this.pages = []; 
    for (var i = 1; i <= pagesCount; i++) 
     this.pages.push(i); 
} 

Dieses, wie ich es in einer anderen Komponente bin mit AboutUsComponent: sind

<pagination [items]="posts" [page-size]="pageSize" (page-changed)="onPageChanged($event)"></pagination> 

die Pfosten geladen in AboutUsComponent:

private loadPosts(){ 
    this.postsLoading = true; 
    this._aboutusService.getPosts().subscribe( 
     posts => {this.posts = posts; 
        this.pagedPosts = this.getPostsInPage(1)}, 
     null, 
     () => { this.postsLoading = false}); 
} 

Wie ich es verstehe passiert wegen .subscribe() asynchronen Laden von Beiträgen und @Input() items = []; könnte geladen werden, bevor Beiträge kommen. Wie kann ich es erwarten oder was über Lösung vorschlagen? Danke.

+0

Sie laden 'this.posts' aber Sie Verwende 'this.items.length'. Vielleicht müssen Sie es in 'this.posts.length' ändern. – Dinistro

+0

Warum verwenden Sie OnChanges? Versuchen Sie OnInit. Wann löst Ihre Komponente loadPosts aus? – kfa

+0

'ngOnChange' feuert zu Beginn des Lebenszyklus der Komponente. Verwenden Sie "try/catch" oder "if", um diesen Fehler zu umgehen. Auch denke ich, besser Ansatz ist, bestimmte Ereignisse zu verwenden, wenn Sie Ihre Artikel neu anordnen möchten. – Kliment

Antwort

0

Sie können den Parameter der ngChanges-Methode überprüfen, um sicherzustellen, dass die Änderungen items entsprechen. Auf diese Weise würden Sie sicher sein, dass der items Eingang gesetzt:

ngOnChanges(changes: SimpleChanges){ 
    if (changes['items']) { // <---- 
    this.currentPage = 1; 
    var pagesCount = this.items.length/this.pageSize; 
    this.pages = []; 
    for (var i = 1; i <= pagesCount; i++) 
     this.pages.push(i); 
    } 
    } 
} 

Die ngOnChanges Methode für jede Änderung aufgerufen wird, sogar auf dem pageSize Eingang ...

+0

SimpleChanges ist unterstrichen und die Fehlermeldung lautet "Kann Name SimpleChanges nicht finden"? – serj

+0

Importieren Sie es aus dem Modul '@ angular/core'? 'import {SimpleChanges} aus '@ angular/core';' –

+0

https://angular.io/docs/ts/latest/api/core/index/SimpleChanges-interface.html –

Verwandte Themen