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
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.
}
}
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 {}
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
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. –
@ GünterZöchbauer Können Sie bitte ein Beispiel für die Freigabe der Daten aus einer Basiskomponente angeben. – Rex
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;
});
}
}
}
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 –
Ja, genau. Es ist komplett transparent für den Abonnenten ;-) Gern geschehen! –
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. –
- 1. Best Practice zum Speichern von Bildern in SQL Server
- 2. Best Practice zum Laden von Anfangsdaten in eine Backbone-App?
- 3. Best Practice zum Aktualisieren von Django contrib
- 4. iOS - Best Practice zum Verwalten von Codezusammenführung in einem Storyboard
- 5. Best Practice zum Definieren von Enums?
- 6. Best Practice zum Initialisieren von Elementvariablen?
- 7. Best Practice zum Erstellen von Web-Services
- 8. Best Practice zum Schreiben von wiederverwendbarem Code
- 9. Schienen: Best Practice zum Speichern von Benutzereinstellungen?
- 10. Best Practice zum Organisieren von Methoden?
- 11. BigQuery-Best Practice zum Segmentieren von Tabellen nach Daten
- 12. ZF2 Best Practice zum Laden Module Dinamisch
- 13. Angular 2 - Verwenden von Observablen in einer Komponente zum Ausgeben von Werten an andere Komponenten
- 14. Best Practice für Angular 2 in TypeScript
- 15. PL/SQL: Best Practice zum Abrufen von 2 oder mehr verbundenen Tabellen von einem Cursor?
- 16. Best Practice von RestAngular
- 17. Best Practice zum Lesen von Formulardaten in React
- 18. Best Practice zum Erstellen von Factory in diesem Fall
- 19. Best Practice zum Hochladen von Dateien in CakePHP
- 20. Angular 2 in VS2015 - Best Practice
- 21. Best Practice zum Aktualisieren von Argumenten eines Fragments?
- 22. Stripe Backend implementieren - Best Practice zum lokalen Speichern von Daten oder zur Verwendung von API-Calls?
- 23. Best Practice Senden von Benutzername und Passwort an den Server von der App
- 24. Best Practices zum Speichern von Daten aus Hunderten von Feldern
- 25. Best Practice zum Verwalten von Web-Service-Anmeldedaten für Node.JS?
- 26. Best Practice laden sicher Bild von url
- 27. Best Practice zum Speichern von Buslinien in einer Datenbank
- 28. Best Practice zum Erstellen von Stub-Dateien mit Ant
- 29. Best Practice zum Zusammenführen von Lösungsdateien mit Projekt-ID-Konflikten
- 30. Best Practice zum Testen von Supervisoren in Elixir
Wenn Sie die Seite aktualisieren, ist die alte Variable wegen Info: Info = {name: "Jack"}; – Diego