Я использую Angular 5, и я создал службу с помощью angular-cli
Я хочу создать службу, которая читает локальный файл json для Angular 5.
Это то, что у меня есть ... Я немного застрял ...
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));
}
}
Как я могу это закончить?
javascript
json
angular
dhilt
источник
источник
HttpClientModule
не следует вводить в конструктор.Ответы:
Во-первых, вам нужно ввести,
HttpClient
а неHttpClientModule
, во-вторых, что вам нужно удалить, он.map((res:any) => res.json())
вам больше не понадобится, потому что новыйHttpClient
по умолчанию предоставит вам тело ответа, наконец, убедитесь, что вы импортируетеHttpClientModule
в свойAppModule
: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"); } }
чтобы добавить это в свой компонент:
@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); }); } }
источник
У вас есть альтернативное решение - напрямую импортировать ваш файл json.
Для компиляции объявите этот модуль в вашем файле typings.d.ts
declare module "*.json" { const value: any; export default value; }
В вашем коде
import { data_json } from '../../path_of_your.json'; console.log(data_json)
источник
import { default as data_json } from '../../path_of_your.json';
Для Angular 7 я выполнил следующие шаги, чтобы напрямую импортировать данные json:
В tsconfig.app.json:
добавить
"resolveJsonModule": true
в"compilerOptions"
В службе или компоненте:
import * as exampleData from '../example.json';
А потом
источник
Я обнаружил этот вопрос, когда искал способ действительно прочитать локальный файл вместо чтения файла с веб-сервера, который я бы предпочел назвать «удаленным файлом».
Просто позвоните
require
:const content = require('../../path_of_your.json');
Исходный код Angular-CLI вдохновил меня: я обнаружил, что они включают шаблоны компонентов, заменяя
templateUrl
свойство наtemplate
и значениеrequire
вызовом фактического HTML-ресурса.Если вы используете компилятор AOT, вам необходимо добавить определения типа узла, настроив
tsconfig.app.json
:"compilerOptions": { "types": ["node"], ... }, ...
источник
require
мне нужно было установить@types/node
, запустив,npm install @types/node --save-dev
как описано здесьimport data from './data.json'; export class AppComponent { json:any = data; }
См. Эту статью для получения более подробной информации .
источник
"allowSyntheticDefaultImports": true
к моему tsconfig.json compilerOptions, но только чтобы остановить ошибку линтинга для TypeScript, а НЕ фактическую ошибку.Попробуй это
Напишите код в свой сервис
import {Observable, of} from 'rxjs';
импортировать файл json
import Product from "./database/product.json"; getProduct(): Observable<any> { return of(Product).pipe(delay(1000)); }
В компоненте
get_products(){ this.sharedService.getProduct().subscribe(res=>{ console.log(res); }) }
источник
Давайте создадим файл JSON, назовем его navbar.json, вы можете называть его как хотите!
navbar.json
[ { "href": "#", "text": "Home", "icon": "" }, { "href": "#", "text": "Bundles", "icon": "", "children": [ { "href": "#national", "text": "National", "icon": "assets/images/national.svg" } ] } ]
Теперь мы создали файл JSON с некоторыми данными меню. Мы перейдем в файл компонента приложения и вставим приведенный ниже код.
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; }
Теперь ваше приложение Angular 7 готово для обслуживания данных из локального файла JSON.
Перейдите на app.component.html и вставьте в него следующий код.
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>
источник
При использовании Typescript 3.6.3 и Angular 6 ни одно из этих решений не помогло мне.
Что действительно работало, так это следовать руководству здесь, в котором говорится, что вам нужно добавить небольшой файл, называемый
njson-typings.d.ts
в ваш проект, содержащий следующее:declare module "*.json" { const value: any; export default value; }
Как только это было сделано, я мог просто импортировать свои жестко закодированные данные json:
import employeeData from '../../assets/employees.json';
и использовать его в моем компоненте:
export class FetchDataComponent implements OnInit { public employees: Employee[]; constructor() { // Load the data from a hardcoded .json file this.employees = employeeData; . . . . }
источник