2016-09-06 8 views
4

Ich habe eine benutzerdefinierte Pipe in Angular 2 RC5 implementiert, die Daten verarbeitet, die ich vom Server bekomme. Das Problem, das ich habe, ist, dass die Pipe vor dem ngOnInit ausführt, wo ich die Anrufe zum Server mache.Angular 2 Pipes ausführen vor ngOnInit

Als Test übergab ich eine bereits gefüllte Liste an die Pipe und alles funktioniert wie erwartet. Das einzige Problem, das ich habe, ist, dass die Pipe ausgeführt wird, wenn die Seite gerendert wird. Und so ist die Liste in diesem Fall leer.

Gibt es eine Möglichkeit, das Rendern der Seite zu "verzögern", so dass beim Ausführen der Pipe die Daten vom Server abgerufen werden?

Dies ist ein Beispiel von meinem Code:

Komponente

ngOnInit() { 
    Observable.forkJoin([ 
     this.testService.get(), 
     this.multilingualService.get(localStorage.getItem('currentPage')) 
    ]).subscribe(servicesResult => { 
     this.mainList = servicesResult[0]; 
     this.pageMultilinguals = servicesResult[1]; 
    }, 
    error => this.handleError(error)); 
} 

Rohr

@Pipe({name: 'multiLang'}) 
export class MultilingualPipe implements PipeTransform { 
    transform(value: string, pageMultilinguals: Multilingual[], context: number): string { 

     for (let i = 0; i < pageMultilinguals.length; i++) { 
      if (pageMultilinguals[i].reference === value && pageMultilinguals[i].contexTypeId === context) { 
       return pageMultilinguals[i].value; 
      } 
     } 
    } 
} 

Vorlage

<span>{{ 'Test' | multiLang: pageMultilinguals: 9 }}</span> 
+0

Können Sie einen Scheck für leere Daten hinzufügen in Ihrer Pfeife und einfach nur den ursprünglichen Wert in diesem Fall? – rook

+0

Ich habe nur ein einfaches Beispiel in die Vorlage eingefügt. Dies ist für eine mehrsprachige Referenz, so dass Sie eine Referenz 'Page_Header_1' haben können und Sie erhalten den Wert zurück. –

Antwort

3

Wenn die Winkelerkennung die Erkennung ändert, wird die Pipe das erste Mal ausgeführt. Nach dem ersten Änderungserkennungslauf wird ngOnInit() aufgerufen. Verzögern des Anrufs zu Ihrer Rohrleitung bis ngOnInit() würde überhaupt nicht helfen, denn wenn Sie den Server Anruf in ngOnInit() machen bedeutet nicht, dass Sie sofort die Antwort erhalten. Die HTTP-Anfrage ist ein Async-Anruf und die Antwort kommt irgendwann, aber ngOnInit() wird schon lange fertig sein.

Ich denke, in Ihrem Fall sollte es genug sein, um nur das Rohr sicher für null Werte zu machen, so dass es Ausnahmen nicht dazu führt, wenn die übergebenen Werte sind null:

@Pipe({name: 'multiLang'}) 
export class MultilingualPipe implements PipeTransform { 
    transform(value: string, pageMultilinguals: Multilingual[], context: number): string { 
     if(!value || !pageMultilinguals || !context) { 
      return null; 
     } 
     for (let i = 0; i < pageMultilinguals.length; i++) { 
      if (pageMultilinguals[i].reference === value && pageMultilinguals[i].contexTypeId === context) { 
       return pageMultilinguals[i].value; 
      } 
     } 
    } 
} 
+0

Danke für Ihre Antwort. Nur um zu verdeutlichen, kann ich nicht wirklich eine Pipe haben, die auf Daten vom Server "wartet", wenn ich die Daten brauche, wenn die Seite geladen wird. In meinem Fall muss ich immer Daten haben, also muss ich meinen Ansatz vielleicht etwas ändern. –

+0

Nur um ein bisschen zu erarbeiten ist dies ein kleines Feature, das ich getestet habe, um übersetzbare Begriffe zu haben. Die Aufgabe der Pipe besteht einfach darin, eine Referenz zu übergeben, und der Text der ausgewählten Sprache wird zurückgegeben. Ich habe versucht, die "Seitenausdrücke" "ngOnInit" zu erhalten, aber wie Sie darauf hingewiesen haben, kann ich die Pipe nicht "verzögern" und auf Daten warten. –

+1

Ich verstehe noch nicht, warum dir das Probleme bereitet. Eine Pipe sollte aufgerufen werden, wenn die Change-Erkennung von Angular2 Änderungen erkennt (Standard) oder jedes Mal, wenn Change Detection (für unreine Pipes) ausgeführt wird, das ist alles. –

Verwandte Themen