我正在使用Angular 5,并且我使用angular-cli
创建了一项服务我想要做的是创建一个读取Angular 5的本地json文件的服务。
这就是我的......我有点卡住......
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));
}
}
我怎样才能完成这个?
答案 0 :(得分:88)
首先你需要注入HttpClient
而不是HttpClientModule
,
第二件事你必须删除.map((res:any) => res.json())
你不再需要它,因为新的HttpClient
默认会给你反应的主体,最后确保你导入{{1}在你的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");
}
}
答案 1 :(得分:17)
您有另一种解决方案,直接导入您的json。
要编译,请在typings.d.ts文件中声明此模块
peppers[3]={4,3,2,1}
在您的代码中
peppers[4]={4,3,2,1}
答案 2 :(得分:8)
我在寻找一种真正读取本地文件而不是从Web服务器读取文件的方法时发现了这个问题,我宁愿将其称为“远程文件”。
只需致电require
:
const content = require('../../path_of_your.json');
Angular-CLI源代码启发了我:我发现它们包含组件模板,方法是将templateUrl
属性的template
替换为require
,并将值替换为对实际HTML的tsconfig.app.json
调用资源。
如果使用AOT编译器,则必须通过调整"compilerOptions": {
"types": ["node"],
...
},
...
添加节点类型定义:
\Documents\IISExpress
答案 3 :(得分:6)
对于Angular 7,我按照以下步骤直接导入json数据:
在tsconfig.app.json中:
在"resolveJsonModule": true
中添加"compilerOptions"
在服务或组件中:
import * as exampleData from '../example.json';
然后
private example = exampleData;
答案 4 :(得分:4)
import data from './data.json';
export class AppComponent {
json:any = data;
}
有关more details,请参见本文。
答案 5 :(得分:3)
假设您在项目的 src/app 文件夹中有一个 data.json 文件,其值如下:
[
{
"id": 1,
"name": "Licensed Frozen Hat",
"description": "Incidunt et magni est ut.",
"price": "170.00",
"imageUrl": "https://source.unsplash.com/1600x900/?product",
"quantity": 56840
},
...
]
import { Component, OnInit } from '@angular/core';
import * as data from './data.json';
@Component({
selector: 'app-root',
template: `<ul>
<li *ngFor="let product of products">
</li>
</ul>`,
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
title = 'Angular Example';
products: any = (data as any).default;
constructor(){}
ngOnInit(){
console.log(data);
}
}
import { Component, OnInit } from '@angular/core';
import { HttpClient } from "@angular/common/http";
@Component({
selector: 'app-root',
template: `<ul>
<li *ngFor="let product of products">
</li>
</ul>`,
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
title = 'Angular Example';
products: any = [];
constructor(private httpClient: HttpClient){}
ngOnInit(){
this.httpClient.get("assets/data.json").subscribe(data =>{
console.log(data);
this.products = data;
})
}
}
但首先我们需要添加一个打字文件,如下所示:
declare module "*.json" {
const value: any;
export default value;
}
将此添加到 src/app 文件夹中的新文件 json-typings.d.ts
文件中。
现在,您可以像 TypeScript 2.9+ 一样导入 JSON 文件。
import * as data from "data.json";
答案 6 :(得分:0)
尝试
在您的服务中编写代码
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 :(得分:0)
让我们创建一个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>
答案 8 :(得分:0)
使用打字稿3.6.3和Angular 6,这些解决方案都不适合我。
的工作是按照教程here进行的,该教程说您需要在项目中添加一个名为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;
. . . .
}