ค้นหาเว็บไซต์

javascript - บริการ Angular 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';

@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

สำหรับ Angular 7 ฉันได้ทำตามขั้นตอนเหล่านี้เพื่อนำเข้าข้อมูล json โดยตรง:

ในไฟล์ tsconfig.app.json:

เพิ่ม "resolveJsonModule": true ใน "compilerOptions"

ในบริการหรือคอมโพเนนต์:

import * as exampleData from '../example.json';

แล้วก็

private example = exampleData;

คำตอบ #3

คุณมีทางออกอีกทางหนึ่ง คือ การนำเข้า 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)

คำตอบ #4

ฉันเจอคำถามนี้เมื่อกำลังมองหาวิธีอ่านไฟล์ท้องถิ่นจริงๆ แทนการอ่านไฟล์จากเว็บเซิร์ฟเวอร์ ซึ่งฉันอยากเรียกว่า "ไฟล์ระยะไกล"

เพียงเรียก require:

const content = require('../../path_of_your.json');

ซอร์สโค้ดของ Angular-CLI เป็นแรงบันดาลใจให้ฉัน: ฉันพบว่าพวกเขารวมเทมเพลตของคอมโพเนนต์โดยการแทนที่คุณสมบัติ templateUrl ด้วย template และค่าโดยการเรียก require ไปยังทรัพยากร HTML จริง

ถ้าคุณใช้คอมไพเลอร์ AOT คุณต้องเพิ่มการกำหนดประเภทโหนดโดยปรับ tsconfig.app.json:

"compilerOptions": {
  "types": ["node"],
  ...
},
...

คำตอบ #5

สมมติว่าคุณมีไฟล์ data.json ในโฟลเดอร์ src/app ของโครงการของคุณโดยมีค่าดังต่อไปนี้:

[
    {
        "id": 1,
        "name": "Licensed Frozen Hat",
        "description": "Incidunt et magni est ut.",
        "price": "170.00",
        "imageUrl": "https://source.unsplash.com/1600x900/?product",
        "quantity": 56840
    },
    ...
]

3 วิธีในการอ่านไฟล์ JSON ภายในเครื่อง

วิธีที่ 1: การอ่านไฟล์ JSON ท้องถิ่นโดยใช้คำสั่ง import ของ TypeScript 2.9+

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);
  }
}

วิธีที่ 2: การอ่านไฟล์ JSON ภายในโดยใช้ Angular HttpClient

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;
    })
  }
}

วิธีที่ 3: การอ่านไฟล์ JSON ท้องถิ่นในแอป Angular แบบออฟไลน์โดยใช้คำสั่ง import ของ ES6+

แต่ก่อนอื่นเราจำเป็นต้องเพิ่มไฟล์การพิมพ์ดังนี้:

declare module "*.json" {
  const value: any;
  export default value;
}

เพิ่มสิ่งนี้ลงในไฟล์ใหม่ json-typings.d.ts ในโฟลเดอร์ src/app

ตอนนี้คุณสามารถนำเข้าไฟล์ JSON ได้เหมือนกับ TypeScript 2.9 ขึ้นไป

import * as data from "data.json";

บทความที่เกี่ยวข้อง