Warten Sie, bis die Daten Vor dem Rendern der Ansicht in Winkel-5
Ich bin neu in Winkel-5 und war in der Lage, erstellen der Ansicht mit Zugang zu den service-Methoden mit Hilfe von zu abonnieren, aber die Begegnung problem in der Verzögerung zu Rendern. Die Benutzer zuerst sehen "undefined" string und nach 0,5 Sek ändern sich die auf den korrekten Wert.
Hier ist die .ts-Datei für die Komponente:
public trips: Trip[];
public numberOfUsers : Map<string, number> = new Map<string, number>();
constructor(private tripService: TripService) { }
ngOnInit() {
this.getTrips();
}
getTrips() {
this.tripService.getTripForMe().subscribe(
data => { this.trips = data;},
err => console.error(err),
() => this.initNumberOfUsers()
);
}
initNumberOfUsers() {
for (let i = 0; i < this.trips.length; i++) {
let count;
this.tripService.getNumberOfUsers().subscribe(
data => { count = data},
err => console.error(err),
() => this.numberOfUsers.set(this.trips[i].id, count)
);
;
}
}
getNumberOfUsers(data) {
return this.numberOfUsers.get(data.id);
}
Die Methode initNumberOfUsers aufgerufen wird, nachdem die erste subscribe-Oberfläche, die ist gut, aber die getNumberOfUsers(Daten) genannt, wahrscheinlich vor und erhalten "undefined".
Hier ist der entsprechende Teil aus dem template ("Daten" ist der aktuelle Wert einer ngFor Schleife):
<span [innerText]="getNumberOfUsers(data)"></span>
Gibt es eine Möglichkeit, um sicherzustellen, dass beide abonnieren Methoden werden nacheinander fertiggestellt vor dem Rendern ?
UPDATE
War ich in der Lage, erstellen Sie einen resolver und die concole zeigen, das Objekt aber, ich Schwierigkeiten haben, übergeben Sie die Daten an die Komponente.
Reolver code:
import { Injectable } from '@angular/core';
import { Router, Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Trip} from ....
import { TripService } from .....
import { Observable } from 'rxjs/Rx';
@Injectable()
export class TripsResolve implements Resolve<Trip[]> {
public trips: Trip[];
constructor(private service: TripService) {}
resolve(route: ActivatedRouteSnapshot,
state: RouterStateSnapshot) {
this.service.getTrips().subscribe(
data => { this.trips = data },
err => console.error(err),
() => console.log(this.trips)
);
return this.trips;
}
}
Von der route
resolve: {
trips: TripsResolve
}
Aus Modul
providers: [
...
TripsResolve,
...
Daten nicht weitergeben/nicht avilavle in der Komponente:
import { Component, OnInit } from '@angular/core';
import { Trip } from ...
import { Router, ActivatedRoute } from '@angular/router';
@Component({
selector: ...
templateUrl: ...
styleUrls: ...
})
export class MyComponent implements OnInit {
public trips: Trip[];
constructor(private route: ActivatedRoute,
private router: Router) {
}
ngOnInit() {
this.route.data.forEach(data => {
this.trips = data.trips;
console.log(this.trips); //can't see it
});
}
}
Irgendeine Idee, wie kann ich Zugang zu/abrufen der Daten in der Komponente ?
InformationsquelleAutor user2304483 | 2018-03-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich vor ähnlichen Fragen, wenn ich mir den Umgang mit Daten durch die API-Aufrufe
Habe ich versucht zwei Lösungen
Ist mit *ngIf
Den DOM bevölkern nur, wenn die Daten bereit sind.
Andere ist mit resolver, vor dem Rendern der Ansicht selbst wird es vorbereiten der Daten. Aber manchmal resolver, wird Ihr Bildschirm leer, wenn das laden von Daten zu viel Zeit benötigt.
So haben Sie zwei Möglichkeiten jetzt.
Ich würde empfehlen, *ngIf. Beim laden der Daten ist im Gange, einige anzeigen loader gif-oder einige-Nachricht an den Benutzer wissen, dass etwas geschieht im hintergrund.
Wir werden mit einem Benutzer-definierten flag-variable erhalten den status der API-Aufruf
InformationsquelleAutor Pandiyan Cool
Könnten Sie kombinieren die zwei Abonnements mit einer mergeMap. Auf diese Weise werden Sie ausstoßen, sobald der Letzte sub ist abgeschlossen-Methode ausgelöst.
Obwohl in Ihrem Fall, Sie finden es möglicherweise einfacher, einfach initialisieren die numberOfUsers auf null. Dann in deinem template verwenden, ng-show, um nur die Spannweite, wenn numberOfUsers ist nicht null.
ex:
cheers
ngShow
macht das element, und gerade effektiv versteckt es... immer noch wirft null-Zeiger... denke nicht, dass das funktionieren würdeSie sind richtig, ngShow noch gilt der tag, um den DOM. Jedoch auf der Grundlage der use-case beschrieben, wäre dies der ideale Ansatz. Es klingt nicht, als ob wir immer Fehler hier, aber eher nur immer zu unerwünschten Ergebnissen bei der transklusion, da die Daten nicht bereit.
Alles, was gesagt, so oder so funktionieren wird, aber basierend auf dem, was versucht wird, erreicht werden, würde ich empfehlen, ngShow in diesem Szenario.
siehe meine Antwort zu Ihrem Kommentar in meiner Antwort 🙂
Zwischen diesen beiden wird er haben einige Optionen, hoffentlich kann er mit Ihnen spielen und finden, was am besten funktioniert. Eine weitere option für ihn sein würde, indem es auf die (aktivierte) route, wie Sie entgangen, Eingabe, oder sogar mehr komplizierte Nutzung der NG Haken , aber diese beiden Vorschläge wird wahrscheinlich das einfachste sein.
InformationsquelleAutor iHazCode
Check-out-Resolver in Eckig.
Hier ist ein link:
https://angular.io/api/router/Resolve
Viel wie Wachen, die Sie ausführen, bevor die Komponente vollständig erstellt und verhindern, dass Sie, um if/else-Logik, die in Ihrer Vorlage für wartet beim laden.
Wenn Sie nicht wollen, zu einem resolver, Sie können auch etwas tun:
myVariable
würde, was Sie wollen, definiert werden, bevor Sie gerendert, die<span>
tag. Ich wollte einfach nicht sehen, das eng in Ihre map 🙂Die Wahl, ob die Verwendung einer resolver-oder if/else, die in den Vorlagen hängt davon ab, was Sie möchten, dass Ihre UX. Wahrscheinlich gibt es andere Gründe, auch, aber, dass man mind.
Ich muss zugeben.. ich hatte nicht Lesen Sie die Frage genau... müde und Dekomprimieren mit einigen Typoskript gimmes... allerdings mit
ngIf
muss nicht auf das layout in einer negativen Weise, wenn SiengIf/Else
- und render-Dinge basierend auf dem Status der Daten...Sicher, das ist richtig, aber dann haben Sie möglicherweise zu bewältigen haben, die DOM-Rendern in eine Kaskade Mode, um Platz für die fehlenden Teile. ngShow könnte etwas sauberer sein in dieser Hinsicht, aber in der Tat entweder Ansatz funktionieren könnte.
Ich Stimme mit ngShow einfacher zu handhaben, das layout ist in einigen Fällen...aber viel schwieriger zu handhaben, null-Werte. Kompromiss, nehme ich an. Ich denke, dass ich persönlich nutze ngIf 95/100 mal... vielleicht muss ich re-bewerten, wenn ich was bei.
Ich bin damit einverstanden, ngIf 90% der Zeit auch. Es sei denn, layout (manchmal maintenance) und die Präsentation einen hohen Stellenwert. Welchen Weg er geht, den lokalen sollte initialisiert werden. Es sei denn, es ist ein Komplexes Objekt, null/undefined sollte nicht eine überlegung sein, die in Ihrer Vorlage. Auch im Falle komplexer Typen.... Safe navigation operator FTW!!!!! myComplexType?.myPotentiallyNullObject?.myPotentiallyNullObjectsPotentiallynullproperty. cheers
InformationsquelleAutor A2345sooted