2016-03-14 5 views
15

Was ist die beste Vorgehensweise zum Speichern (und Teilen) von Anfangswerten in einer Angular 2-Anwendung mithilfe eines Dienstes? Ich habe einen Dienst, der viele Daten von einem Server als Ressourcen, Konfigurationen und andere, die Array und Objekte sind, lädt. Ich möchte diese Daten nicht jedes Mal laden, wenn ich eine Komponente lade oder wenn ich zu einer Ansicht route, ich möchte diese Objekte und das Array bereits beim Start der Anwendung laden und gegebenenfalls neu laden. Die Frage ist, wo ist der richtige Ort, um diese Werte zu speichern und zu teilen über Komponenten, die den Service nutzen? Danke.Angular 2, Best Practice zum einmaligen Laden von Daten von einem Server und zum Teilen von Ergebnissen an Komponenten

Antwort

13

Sie müssen darüber nachdenken, Shared Service und stellen Sie sicher, dass nur einzelne Instanz unter geteilt wird Komponenten.

shared service and shared object demo

Hinweis:
vergessen Sie nicht, Dienst Funktion in Bootstrap zu registrieren. Code tief beachten. du wirst bekommen, was du willst. Routing-Teil wird nicht demonstriert. Surf zupft für die weitere Umsetzung

service.ts

import {Component, Injectable,Input,Output,EventEmitter} from 'angular2/core' 
import {Router} from 'angular2/router'; 
import {Http} from 'angular2/http'; 


export interface Info { 
    name:string; 
} 

@Injectable() 
export class NameService { 

    constructor(http:Http;router:Router) 
    { 
    this.http=http; 
    // you can call server resource from here and store it down to any variable. 
    } 

    info: Info = { name : "Jack" }; 
    change(){ 
    this.info.name = "Jane"; // this.info is shared among components. 

    } 
} 
+0

Wenn Sie die Seite aktualisieren, ist die alte Variable wegen Info: Info = {name: "Jack"}; – Diego

10

Der richtige Ort ist definitiv ein Service. Wenn Sie diesen Dienst nur als Anbieter an einer Stelle hinzufügen, wird eine Instanz für die gesamte Anwendung freigegeben. Wenn Sie es an die Anbieter auf jeder Komponente hinzufügen, wird jede Komponente eine eigene Instanz - das ist, was Sie

bootstrap(AppComponent, [HTTP_PROVIDERS, MyService]); 
@Component({ 
    selector: 'some-comp', 
    providers: [/* don't add MyService here !! */]}) 
class MyComponent {} 
+0

Wäre es nicht besser, den Service zu bieten, um nur die höchste Komponente in dem Baum, die es braucht? Dann wissen nicht verwandte Komponenten Ihren neu erstellten Dienst nicht? – ReactingToAngularVues

+0

Genau, wenn nur eine Komponente den Service benötigt. Es ist nur einer der häufigsten Fehler, dass Dienste für jede Komponente zur Verfügung gestellt werden, die es injiziert, selbst wenn eine gemeinsame Instamce benötigt wird. Daher bin ich ein bisschen vorsichtig, wenn ich vorschlage, eine Komponente bereitzustellen. –

+0

@ GünterZöchbauer Können Sie bitte ein Beispiel für die Freigabe der Daten aus einer Basiskomponente angeben. – Rex

22

Gunter ist völlig Recht in Bezug auf Shared Services vermeiden wollen!

Hier sind einige weitere Details für einen HTTP, die auf beobachtbaren und im Cache gespeicherten Daten für den nächsten Anrufe beruht:

export class SharedService { 
    constructor(private http:Http) { 
    } 

    getData() { 
    if (this.cachedData) { 
     return Observable.of(this.cachedData); 
    } else { 
     return this.http.get(...) 
      .map(res => res.json()) 
      .do((data) => { 
       this.cachedData = data; 
      }); 
    } 
    } 
} 
+0

Ihre Implementierung ist sehr interessant! Also können alle Komponenten die "subscribe" -Funktion verwenden, um neue oder zwischengespeicherte Daten zu laden, ich habe recht? Vielen Dank –

+0

Ja, genau. Es ist komplett transparent für den Abonnenten ;-) Gern geschehen! –

+0

Ich versuche, diese Struktur zu implementieren, mein einziger Zweifel ist, dass meine API ein Array Objekte zurückgibt, aber in meinem "GetData", aber ich möchte nur ein Objekt (das einem bestimmten Index zum Beispiel entsprechen), und auch Änderungen darüber propagieren Objekt für alle Komponenten, wenn der Server ein neues Objekt-Array zurückgibt (nach einer "Reload" -Funktion im Service zum Beispiel). Haben Sie Vorschläge, um dieses Ergebnis zu erzielen? Nochmals vielen Dank für Ihre Zeit. –

Verwandte Themen