Używam Angular 5 i utworzyłem usługę przy użyciu angular-cli
Chcę stworzyć usługę odczytującą lokalny plik JSON dla Angular 5.
Oto, co mam ... Trochę utknąłem ...
import { Injectable } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
@Injectable()
export class AppSettingsService {
constructor(private http: HttpClientModule) {
var obj;
this.getJSON().subscribe(data => obj=data, error => console.log(error));
}
public getJSON(): Observable<any> {
return this.http.get("./assets/mydata.json")
.map((res:any) => res.json())
.catch((error:any) => console.log(error));
}
}
Jak mogę to zakończyć?
javascript
json
angular
dhilt
źródło
źródło
HttpClientModule
nie powinno być wstrzykiwane w konstruktorze.Odpowiedzi:
Najpierw musisz wstrzyknąć,
HttpClient
a nieHttpClientModule
, druga rzecz, którą musisz usunąć.map((res:any) => res.json())
, nie będzie już potrzebna, ponieważ nowaHttpClient
domyślnie poda ci treść odpowiedzi, na koniec upewnij się, że importujeszHttpClientModule
wAppModule
:import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; @Injectable() export class AppSettingsService { constructor(private http: HttpClient) { this.getJSON().subscribe(data => { console.log(data); }); } public getJSON(): Observable<any> { return this.http.get("./assets/mydata.json"); } }
aby dodać to do swojego komponentu:
@Component({ selector: 'mycmp', templateUrl: 'my.component.html', styleUrls: ['my.component.css'] }) export class MyComponent implements OnInit { constructor( private appSettingsService : AppSettingsService ) { } ngOnInit(){ this.appSettingsService.getJSON().subscribe(data => { console.log(data); }); } }
źródło
Masz alternatywne rozwiązanie, importując bezpośrednio plik json.
Aby skompilować, zadeklaruj ten moduł w pliku typings.d.ts
declare module "*.json" { const value: any; export default value; }
W twoim kodzie
import { data_json } from '../../path_of_your.json'; console.log(data_json)
źródło
import { default as data_json } from '../../path_of_your.json';
W przypadku Angular 7 wykonałem następujące kroki, aby bezpośrednio zaimportować dane json:
W tsconfig.app.json:
dodać
"resolveJsonModule": true
w"compilerOptions"
W usłudze lub komponencie:
import * as exampleData from '../example.json';
I wtedy
źródło
Znalazłem to pytanie, kiedy szukałem sposobu, aby naprawdę odczytać plik lokalny zamiast czytać plik z serwera WWW, który wolałbym nazwać „plikiem zdalnym”.
Po prostu zadzwoń
require
:const content = require('../../path_of_your.json');
Zainspirował mnie kod źródłowy Angular-CLI: dowiedziałem się, że zawierają one szablony komponentów, zastępując
templateUrl
właściwość przez,template
a wartość przezrequire
wywołanie rzeczywistego zasobu HTML.Jeśli używasz kompilatora AOT, musisz dodać definicje typu węzła, dostosowując
tsconfig.app.json
:"compilerOptions": { "types": ["node"], ... }, ...
źródło
require
, musiałem zainstalować@types/node
, uruchamiając,npm install @types/node --save-dev
jak omówiono tutajimport data from './data.json'; export class AppComponent { json:any = data; }
Więcej informacji znajdziesz w tym artykule .
źródło
"allowSyntheticDefaultImports": true
do mojego tsconfig.json 'compilerOptions', ale tylko po to, aby zatrzymać błąd lintingu dla TypeScript, a NIE rzeczywisty błąd.Spróbuj tego
Napisz kod w swojej usłudze
import {Observable, of} from 'rxjs';
importuj plik json
import Product from "./database/product.json"; getProduct(): Observable<any> { return of(Product).pipe(delay(1000)); }
W komponencie
get_products(){ this.sharedService.getProduct().subscribe(res=>{ console.log(res); }) }
źródło
Stwórzmy plik JSON, nazywamy go navbar.json, możesz go nazwać, jak chcesz!
navbar.json
[ { "href": "#", "text": "Home", "icon": "" }, { "href": "#", "text": "Bundles", "icon": "", "children": [ { "href": "#national", "text": "National", "icon": "assets/images/national.svg" } ] } ]
Teraz stworzyliśmy plik JSON z danymi menu. Przejdziemy do pliku składnika aplikacji i wkleimy poniższy kod.
app.component.ts
import { Component } from '@angular/core'; import menudata from './navbar.json'; @Component({ selector: 'lm-navbar', templateUrl: './navbar.component.html' }) export class NavbarComponent { mainmenu:any = menudata; }
Teraz Twoja aplikacja Angular 7 jest gotowa do obsługi danych z lokalnego pliku JSON.
Przejdź do app.component.html i wklej w nim następujący kod.
app.component.html
<ul class="navbar-nav ml-auto"> <li class="nav-item" *ngFor="let menu of mainmenu"> <a class="nav-link" href="{{menu.href}}">{{menu.icon}} {{menu.text}}</a> <ul class="sub_menu" *ngIf="menu.children && menu.children.length > 0"> <li *ngFor="let sub_menu of menu.children"><a class="nav-link" href="{{sub_menu.href}}"><img src="{{sub_menu.icon}}" class="nav-img" /> {{sub_menu.text}}</a></li> </ul> </li> </ul>
źródło
Używając Typescript 3.6.3 i Angular 6, żadne z tych rozwiązań nie działało dla mnie.
Co zrobił pracy było śledzić tutorial tutaj który mówi, trzeba dodać mały plik o nazwie
njson-typings.d.ts
do projektu, zawierające w ten sposób:declare module "*.json" { const value: any; export default value; }
Gdy to zrobiłem, mogłem po prostu zaimportować moje zakodowane na stałe dane json:
import employeeData from '../../assets/employees.json';
i użyj go w moim komponencie:
export class FetchDataComponent implements OnInit { public employees: Employee[]; constructor() { // Load the data from a hardcoded .json file this.employees = employeeData; . . . . }
źródło