Laden Sie JSON-Inhalte aus einer lokalen Datei mit http.get() in Angular 2
Lesezeit: 10 Minuten
webta.st.ic
Ich versuche, eine lokale JSON-Datei mit zu laden http.get() in Angular 2. Ich habe etwas ausprobiert, das ich hier auf Stack Overflow gefunden habe. Es sieht aus wie das:
Das ist mein app.module.ts wo ich import der HttpModule und der JsonModule von @angular/http:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule, JsonpModule } from '@angular/http';
import { RouterModule, Routes } from '@angular/router';
import { AppComponent } from './app.component';
import { NavCompComponent } from './nav-comp/nav-comp.component';
import { NavItemCompComponent } from './nav-comp/nav-item-comp/nav-item-comp.component';
@NgModule({
declarations: [
AppComponent,
NavCompComponent,
NavItemCompComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
JsonpModule,
RouterModule.forRoot(appRoutes)
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
In meinem KomponenteICH importHttp und Response von @angular/http. Dann habe ich eine Funktion aufgerufen loadNavItems()wo ich versuche, meinen JSON-Inhalt mit einem relativen Pfad zu laden http.get() und drucken Sie das Ergebnis mit aus console.log(). Die Funktion wird aufgerufen ngOnInit():
Es gibt keine Fehler in der Konsole und ich bekomme nur diese Ausgabe:
In meinem HTML-Vorlage Ich möchte die Elemente wie folgt schleifen:
<app-nav-item-comp *ngFor="let item of navItems" [item]="item"></app-nav-item-comp>
Ich habe das mit einer Lösung gemacht, die ich hier auf Stack Overflow gefunden habe, aber warum funktioniert es nicht?
Relativen Pfad bearbeiten:
Ich habe auch ein Problem mit meinem relativen Pfad, aber ich bin mir sicher, dass es der richtige ist, wenn ich ihn verwende ../data/navItems.json. Auf dem Screenshot sieht man die nav-comp.component.ts Datei, in der ich den JSON-Inhalt über einen relativen Pfad aus der JSON-Datei lade, die sich im Ordner namens data befindet? Was ist falsch? Gibt die Konsole einen 404-Fehler aus, weil sie meine JSON-Datei nicht im relativen Pfad finden kann?
Ich habe meine eigene Lösung gefunden und poste sie unten (als richtige Antwort markiert). Danke noch einmal.
– webta.st.ic
16. Januar 2018 um 15:26 Uhr
Ich habe ein ähnliches Problem, aber etwas anders. Ich habe ein Bild im Assets-Ordner. Und ich habe eine Eigenschaft vom Typ File in meinem Dienst. Ich möchte dieses Bild in meinen Assets in a einlesen File Geben Sie Object ein. Können Sie dabei helfen?
– Himanshu Mittal
13. September 2021 um 17:04 Uhr
Eugen Sunic
Für Winkel 5+führen Sie nur Schritte aus 1 und 4
Um lokal auf Ihre Datei zuzugreifen in Eckig 2+ Sie sollten Folgendes tun (4 Schritte):
[1] Erstellen Sie in Ihrem Assets-Ordner eine .json Datei, Beispiel: data.json
[2] Gehen Sie zu Ihrem angle.cli.json (angular.json in Angular 6+) in Ihrem Projekt und in der Vermögenswerte Array legen Sie ein anderes Objekt (nach der Paket.json Objekt) so:
Merken, data.json ist nur die Beispieldatei, die wir zuvor im Ordner „Assets“ hinzugefügt haben (Sie können Ihre Datei beliebig benennen).
[3] Versuchen Sie, über localhost auf Ihre Datei zuzugreifen. Es sollte innerhalb dieser Adresse sichtbar sein, http://localhost:your_port/assets/data.json
Wenn es nicht sichtbar dann hast du was falsch gemacht. Stellen Sie sicher, dass Sie darauf zugreifen können, indem Sie sie in das URL-Feld Ihres Browsers eingeben, bevor Sie mit Schritt 4 fortfahren.
[4] Führen Sie nun eine GET-Anforderung durch, um Ihre abzurufen .json Datei (Sie haben Ihren vollständigen Pfad .json URL und es sollte einfach sein)
constructor(private http: HttpClient) {}
// Make the HTTP request:
this.http.get('http://localhost:port/assets/data.json')
.subscribe(data => console.log(data));
Hallo Eugen, ich werde es später versuchen, hoffe das funktioniert! Vielen Dank
– webta.st.ic
31. Oktober 2017 um 8:22 Uhr
Ich werde es heute versuchen und berichten.
– webta.st.ic
6. November 2017 um 12:11 Uhr
@kingforever wo würdest du es hinstellen wollen? Die Assets-Datei ist für solche Szenarien vorgesehen.
– Eugen Sunic
24. Februar 2018 um 13:26 Uhr
In Angular 5 müssen Sie lediglich die .json-Datei im Ordner „Assets“ ablegen, wie in Schritt 1 erwähnt, und direkt in Ihrem Serviceaufruf darauf verweisen, wie in Schritt 4 erwähnt. Bei mir funktioniert es.
– Manoj Amalradsch
13. März 2018 um 18:07 Uhr
Das ist eine ziemlich saubere Lösung. Danke für die Antwort.
loadNavItems() {
this.navItems = this.http.get("../data/navItems.json")
.map(res => res.json())
.do(data => console.log(data));
// This is optional. You can remove the last line
// if you don't want to log the loaded JSON file
// in the console.
}
Weil this.http.get gibt ein zurück Observable<Response> und Sie wollen nicht die Antwort, Sie wollen ihren Inhalt.
Die console.log zeigt Ihnen ein Observable, was korrekt ist, da navItems ein enthält Observable<Response>.
Um Daten richtig in Ihre Vorlage zu bekommen, sollten Sie eine verwenden async Rohr.
<app-nav-item-comp *ngFor="let item of navItems | async" [item]="item"></app-nav-item-comp>
“Property Map existiert nicht für Typ Observable” ?
– webta.st.ic
18. Mai 2017 um 8:44 Uhr
Ich habe “import ‘rxjs/add/operator/map’;” importiert, der Fehler ist nicht mehr da, aber die Ausgabe in der Konsole ist die gleiche?
– webta.st.ic
18. Mai 2017 um 8:48 Uhr
hinzufügen import 'rxjs/add/operator/map'; bei Ihren Importen, bzw import {Observable} from 'rxjs'; und ändern navItems: any Pro navItems:Observable<any>
– Supamiu
18. Mai 2017 um 8:48 Uhr
@MrBuggy Wenn Sie eine Eingabe für die Konsole haben möchten, kann ich die Antwort bearbeiten, um eine hinzuzufügen, aber ich dachte, Ihr Hauptproblem besteht darin, den Inhalt in Ihrer Vorlage zu rendern, also habe ich die Datei console.log entfernt.
– Supamiu
18. Mai 2017 um 8:49 Uhr
Lassen Sie uns diese Diskussion im Chat fortsetzen.
– Supamiu
18. Mai 2017 um 8:58 Uhr
webta.st.ic
Meine eigene Lösung
Ich habe eine neue erstellt component namens test in diesem Ordner:
Ich habe auch einen Mock namens erstellt test.json in dem assets Ordner erstellt von angular cli (wichtig):
Im Controller meiner Komponente test, import Folgen rxjs so was:
import 'rxjs/add/operator/map'
Das ist wichtig, weil Sie es müssen map dein response aus dem HTTP BEKOMMEN aufrufen, sodass Sie JSON-Inhalte erhalten und diese in Ihrer Schleife ausführen können ngFor. Hier ist mein Code, wie ich die Scheindaten lade. ich benutzte httpget und nannte meinen Weg zum Schein mit diesem Weg this.http.get("/assets/mock/test/test.json"). Danach ich map die Antwort u subscribe es. Dann weise ich es meiner Variablen zu items und Schleife es mit ngFor in meinem template. Ich exportiere auch den Typ. Hier ist mein gesamter Controller-Code:
<div *ngFor="let item of items">
{{item.name}}
</div>
Es funktioniert wie erwartet! Ich kann jetzt weitere Scheindateien im Assets-Ordner hinzufügen und einfach den Pfad ändern, um ihn als zu erhalten json. Beachten Sie, dass Sie auch die importieren müssen HTTP und Response in Ihrem Steuergerät. Dasselbe in Ihnen app.module.ts (main) wie folgt:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpModule, JsonpModule } from '@angular/http';
import { AppComponent } from './app.component';
import { TestComponent } from './components/molecules/test/test.component';
@NgModule({
declarations: [
AppComponent,
TestComponent
],
imports: [
BrowserModule,
HttpModule,
JsonpModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
.map(data => data.json() as Array) Diese Zeile sagt mir, dass Object die Methode ‘json’ nicht hat
– Ran Lottem
1. März 2018 um 0:15 Uhr
@RanLottem Exportierst du den Typ “Item” korrekt?
– webta.st.ic
1. März 2018 um 9:14 Uhr
Ungeachtet des Typs, in den ich in dieser Zeile umgewandelt habe, gibt data.json() immer noch einen Fehler aus, dass „Object“ keine json-Eigenschaft hat.
– Ran Lottem
1. März 2018 um 11:31 Uhr
Der Standard-get gibt json zurück, keine Notwendigkeit, .json() zu tun
– Sam Vloeberghs
24. Februar 2019 um 20:23 Uhr
T04435
Das fand ich einfachste Eine Möglichkeit, dies zu erreichen, besteht darin, die hinzuzufügen file.json Datei unter Ordner Vermögenswerte.
Gibt es nicht beliebig Datei bearbeiten müssen .angular-cli.json.
Idealerweise möchten Sie dies nur in einer Entwicklungsumgebung haben, also erstellen Sie eine Variable auf Ihrer, um kugelsicher zu sein umwelt.ts Datei:
Dies ist eine weitere Möglichkeit, das Problem zu lösen. Ja, ich verwende hauptsächlich Async-Pipe, um zu vermeiden, dass Variablen nur zum Speichern von Ergebnissen verwendet werden. Außerdem ist die asynchrone Pipe für mich besser, da sie sich für Sie abmeldet, was bedeutet, dass Sie Speicherlecks vermeiden, wenn Sie Observables haben, die über Seiten hinweg persistent sind (z. B. Dienste).
– Supamiu
18. Mai 2017 um 8:57 Uhr
Ich stimme zu. Es ist ein einfacherer Weg, das Problem zu lösen und zu verstehen, aber am Ende werde ich Sie Ihre Lösung verwenden.
– starte es
18. Mai 2017 um 9:10 Uhr
Ich habe meine eigene Lösung gefunden und poste sie unten (als richtige Antwort markiert). Danke noch einmal.
– webta.st.ic
16. Januar 2018 um 15:27 Uhr
14414100cookie-checkLaden Sie JSON-Inhalte aus einer lokalen Datei mit http.get() in Angular 2yes
Ich habe meine eigene Lösung gefunden und poste sie unten (als richtige Antwort markiert). Danke noch einmal.
– webta.st.ic
16. Januar 2018 um 15:26 Uhr
Ich habe ein ähnliches Problem, aber etwas anders. Ich habe ein Bild im Assets-Ordner. Und ich habe eine Eigenschaft vom Typ
File
in meinem Dienst. Ich möchte dieses Bild in meinen Assets in a einlesenFile
Geben Sie Object ein. Können Sie dabei helfen?– Himanshu Mittal
13. September 2021 um 17:04 Uhr