Угловой 5 Сервис для чтения локального файла.json
Я использую 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));
}
}
Как я могу закончить это?
Ответы
Ответ 1
Во-первых, вам нужно внедрить HttpClient
а не HttpClientModule
, во-вторых, вам нужно удалить .map((res:any) => res.json())
вам больше не понадобится, потому что новый HttpClient
даст вам тело ответ по умолчанию, наконец, убедитесь, что вы импортируете HttpClientModule
в свой AppModule
:
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
@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);
});
}
}
Ответ 2
У вас есть альтернативное решение, импортирующее непосредственно ваш 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)
Ответ 3
Для Angular 7 я выполнил следующие шаги, чтобы напрямую импортировать данные json:
В tsconfig.app.json:
добавить "resolveJsonModule": true
в "compilerOptions"
В услуге или компоненте:
import * as exampleData from '../example.json';
А потом
private example = exampleData;
Ответ 4
Я нашел этот вопрос при поиске способа действительно прочитать локальный файл вместо чтения файла с веб-сервера, который я бы скорее назвал "удаленным файлом".
Просто позвоните require
:
const content = require('../../path_of_your.json');
Исходный код Угловое-CLI вдохновил меня: я узнал, что они включают в себя составные шаблоны, заменив templateUrl
свойство по template
, а значение с помощью require
вызова фактического HTML ресурса.
Если вы используете компилятор AOT, вам нужно добавить определения типа узла, настроив tsconfig.app.json
:
"compilerOptions": {
"types": ["node"],
...
},
...
Ответ 5
import data from './data.json';
export class AppComponent {
json:any = data;
}
Подробнее об этом читайте в more details.
Ответ 6
Попробуй это
Напишите код в вашем сервисе
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);
})
}
Ответ 7
Давайте создадим файл 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>