2016-08-07 13 views
4

Ich benutze Winkel 2 mit der mit infinite scrolling und wenn ich ein Element aus der Liste auswählen, navigieren ich zu der Detailansicht, die eine: ID im URL-Pfad darstellt . Wenn ich zurück navigiere, wird die Listenansicht neu geladen und der Anfangszustand ist verloren.Wie Zwischenspeichern oder View-Status auf History in Angular beibehalten 2

Was ist der richtige Weg, um den Status der Ansicht beim Zurückfahren zu erhalten? Ist es möglich, die Ansicht so zu speichern, wie sie ist, bevor die Navigation stattfindet?

+0

Es gibt Pläne, dies zu unterstützen, aber derzeit werden Komponenten immer neu erstellt, außer wenn nur ein Parameter in derselben Route geändert wird. –

+0

Haben Sie weitere Informationen dazu gefunden? Ich bin dabei, einen ViewStateService in meiner Angular App zu entwickeln. Ich denke, es ist möglich, aber alle schiffbaren Komponenten auf oberster Ebene erstellen einen Ansichtszustand, und dieser Ansichtsstatus muss als Eingabe an alle Unterkomponenten übergeben werden, so dass sie zum Ansichtszustand hinzugefügt werden können. Ich denke, es wird chaotisch sein, aber ich sehe keine Alternative. –

+0

Leider nein. Zur Zeit speichere ich nur die Elemente für eine History-Back-Level und erinnere mich an die Scroll-Position. Es wäre schöner, wenn die Listenansicht versteckt und im Speicher wäre. Es ist ein wenig umständlich, wenn man zurückgeht und es dauert einen Moment, alle scrollenden Elemente neu zu laden und an die neue Position zu scrollen. – doorman

Antwort

2

Dies ist theoretisch möglich, aber ich habe es noch nicht versucht.

Wenn Sie Ihre Detailansicht als untergeordnete Route oder Komponente platzieren, wird Ihre Listenansichtskomponente bei untergeordneter Route/Komponenteninitialisierung nicht zerstört. Dann könnten Sie die Elternkomponente ausblenden und zu Kind navigieren. Obwohl dies keine richtige Lösung ist, müssen Sie eine Möglichkeit finden, den Status der Listenansicht zu speichern.

3

Zunächst möchte ich sagen, dass ich glaube, dass Unterstützung für "View-State" ein Teil des Rahmens sein sollte. Und es kann sehr gut sein, aber ich konnte es noch nicht finden. Aber da ich jetzt eine Lösung brauche, habe ich beschlossen, meine eigene zu rollen. So funktioniert das.

Ich habe einen ViewStateService wie folgt erstellt. Beachten Sie, dass es sich bei dem ViewState für den Service um eine Karte mit Karten handelt. Jede Top-Level-Komponente, zu der navigiert werden kann, hat einen Top-Level-Map-Eintrag mit dem Komponentennamen als Schlüssel. Die Karte an dieser Taste wird verwendet, um zu den Unterkomponenten weiterzuleiten, um sowohl ihren gespeicherten Ansichtszustand als auch einen Ort zum Speichern ihres Ansichtsstatus beizubehalten.

@Injectable() 
export class ViewStateService { 
    viewState : Map<string, Map<string, string> > = new Map<string, Map<string, string> >(); 
    constructor(){ 
    } 

    setViewState(key : string , map : Map<string, string>){ 
    this.viewState.set(key, map); 
    } 

    getViewState(key : string) : Map<string, string>{ 
    return this.viewState.get(key); 
    } 
} 

Dann in Top-Level-Komponenten, dieser Service wird injiziert. Die oberste Ebene Komponente extrahiert dann seinen Ansichtszustand in ngOnInit() durch den Aufruf:

this.viewState = this.viewStateServices.getViewState("ComponentName"); 

Diese Karte wird als eine Eingabe an jeden Subkomponente (oder zumindest diejenigen, die Ansichtszustand speichern müssen) weitergegeben. Die Unterkomponenten implementieren alle OnInit und OnDestroy. In ngOnInit() rufen sie den gespeicherten Ansichtszustand ab - wenn er dort ist. Und in ngOnDestroy() speichern sie alle Viewstate, die sie wollen. Jede Unterkomponente übergibt den Ansichtszustand auch als Eingabe an Unterunterkomponenten (rekursiv). Auf diese Weise erhält jede Unterkomponente eine Chance zum Speichern und Wiederherstellen von Viewstate. Eine Sache, auf die Sie achten sollten, sind Komponenten, die versuchen, einen Wert mit demselben Namen zu speichern. Sie können dies abschwächen, indem Sie allen Feldern den Komponentennamen oder eine andere solche Konvention voranstellen.

Ich habe dies für meine Angular App getan und es scheint zufriedenstellend zu funktionieren. Ich denke jedoch, dass der Rahmen diesen Mechanismus wirklich bereitstellen sollte. Wenn und wenn es funktioniert (oder wenn ich herausfinde, wie es funktioniert), plane ich, es zu benutzen. Aber in der Zwischenzeit habe ich eine Lösung, die funktioniert.

+0

diese Methode ist beeindruckend. Kann ich weiter wissen, wie Sie dies tatsächlich umsetzen?Wie übergibt man eine Komponente an den ViewStateService? – Pragun

+1

Es ist so gut erklärt, wie ich oben kann. Die oberste navigierbare Komponente hat einen View-Status-Member. Dieses Element wird als Eingabe an jede Unterkomponente übergeben. Sub-Komponenten, müssen wiederum zu Sub-Sub-Komponenten usw. übergeben. Das ist der unordentliche Teil. Aber es funktioniert. –