স্থানীয় .json ফাইল পড়তে কৌণিক 5 পরিষেবা


99

আমি কৌণিক 5 ব্যবহার করছি এবং আমি কৌণিক-ক্লিপ ব্যবহার করে একটি পরিষেবা তৈরি করেছি

আমি যা করতে চাই তা হল একটি পরিষেবা তৈরি করা যা 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));

  }

}

আমি কীভাবে এটি শেষ করতে পারি?


4
angular.io/tutorial/toh-pt6 উদাহরণস্বরূপ, HttpClientModuleকনস্ট্রাক্টর ইনজেকশন করা উচিত নয়।
AJT82

উত্তর:


133

প্রথমে আপনাকে ইনজেকশন দিতে হবে 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);
        });
   }
}

4
আমি "অমীমাংসিত প্রকারের পর্যবেক্ষণযোগ্য" পাচ্ছি ... এই লাইনে "পাবলিক getJSON (): পর্যবেক্ষণযোগ্য

4
একটি শেষ প্রশ্ন ... আমি কীভাবে আমার উপাদান থেকে এই ডেটা করতে পারি?

মনে করুন আমি যদি জেসন আইডি পড়তে চাই আমি কি করতে আছে? আপনি যদি আমাকে উদাহরণ প্রদান করতে মন চান না দয়া করে।
user3669026


19

আপনার বিকল্প সমাধান রয়েছে, সরাসরি আপনার জসন আমদানি করুন।

সংকলন করতে, আপনার typings.d.ts ফাইলে এই মডিউলটি ঘোষণা করুন

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

আপনার কোডে

import { data_json } from '../../path_of_your.json';

console.log(data_json)

মনে করুন, আমার সম্পদ / abc.json এ আমার জসন রয়েছে এবং কেবলমাত্র একটি মডিউল অ্যাপ.মডিউল.এসটি ব্যবহার করছি তারপরে টাইপিং.ড.এসটি কীভাবে ঘোষণা করবেন এবং কীভাবে আমদানি করবেন। সাহায্য করুন.
মাহি

আপনার typing.d.ts ফাইলটিতে মডিউলটি কেবল ঘোষণা করুন। এবং আপনার জাসনকে আপনার শ্রেণিতে আমদানি করুন
নিকোলাস আইন-

কোন মডিউল? ধরুন আমি এটি অ্যাপটিতে ব্যবহার করছি। মডিউল ts?
মাহি

6
আমি যখন এটি করেছি ত্রুটি ছাড়াই import { default as data_json } from '../../path_of_your.json';
এটির

4
আমি কনসোলে কেন "অপরিজ্ঞাত" হয়ে যাচ্ছি?
গ্রুমাইন

19

কৌণিক 7 এর জন্য, আমি সরাসরি জসন ডেটা আমদানি করতে এই পদক্ষেপগুলি অনুসরণ করেছি:

Tsconfig.app.json এ:

যোগ "resolveJsonModule": trueমধ্যে"compilerOptions"

একটি পরিষেবা বা উপাদান:

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

এবং তারপর

private example = exampleData;

14

ওয়েব সার্ভার থেকে কোনও ফাইল পড়ার পরিবর্তে একটি স্থানীয় ফাইল সত্যিই পড়ার উপায় সন্ধান করার সময় আমি এই প্রশ্নটি পেয়েছি, যার পরিবর্তে আমি একটি "রিমোট ফাইল" কল করব।

শুধু কল করুন require:

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

কৌণিক-সিএলআই উত্স কোডটি আমাকে অনুপ্রাণিত করেছিল: আমি জানতে পেরেছিলাম যে তারা প্রকৃত এইচটিএমএল সংস্থানকে কল করে templateUrlসম্পত্তি templateএবং মান দ্বারা প্রতিস্থাপন করে উপাদান উপাদানগুলি অন্তর্ভুক্ত requireকরে।

আপনি যদি এওটি সংকলক ব্যবহার করেন তবে আপনাকে নোডের ধরণের সংজ্ঞা যোগ করতে হবে tsconfig.app.json:

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

4
ব্যবহারের জন্য requireআমাকে এখানে আলোচনা হিসাবে @types/nodeচালিয়ে ইনস্টল করতে হবেnpm install @types/node --save-dev
jaycer

এই সমস্ত সমাধানগুলি দুর্দান্ত, তবে এটিই কেবলমাত্র একটি যা আমাকে প্রাথমিক মান আমন্ত্রণ ছাড়াই মানগুলি সংরক্ষণ করতে এবং ফাইলের বিষয়বস্তুটিকে গতিময়ভাবে পার্স করার অনুমতি দেবে
অ্যারন ম্যাথিউজ

6
import data  from './data.json';
export class AppComponent  {
    json:any = data;
}

আরও তথ্যের জন্য এই নিবন্ধটি দেখুন ।


আমার স্থানীয় ফাইলের জন্য এটি ব্যবহার করা সহজ ছিল। আমাকে "allowSyntheticDefaultImports": trueআমার tsconfig.json 'compilerOptions' এ যুক্ত করতে হয়েছিল, তবে কেবল টাইপস্ক্রিপ্টের জন্য একটি আবরণ ত্রুটি বন্ধ করতে, কোনও আসল ত্রুটি নয়।
রিন এবং লেন

এই সমাধান হল: hackeruna.com/2020/04/27/... এই ত্রুটি TS1259 জন্য
juanitourquiza

3

এটা চেষ্টা কর

আপনার সেবার কোড লিখুন

import {Observable, of} from 'rxjs';

আমদানি জেসন ফাইল

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

4
তাদের tsconfig মধ্যে সত্য: বেশী যে, "resolveJsonModule" যোগ করতে সক্ষম হয় না জন্য মুহূর্ত থেকে সবচেয়ে ভালো উত্তর
সোনি

0

আসুন একটি জেএসএন ফাইল তৈরি করি, আমরা এটি নামকরণ করি navbar.json আপনি যা খুশি নাম রাখতে পারেন!

navbar.json

[
  {
    "href": "#",
    "text": "Home",
    "icon": ""
  },
  {
    "href": "#",
    "text": "Bundles",
    "icon": "",
    "children": [
      {
        "href": "#national",
        "text": "National",
        "icon": "assets/images/national.svg"
      }
    ]
  }
]

এখন আমরা কিছু মেনু ডেটা সহ একটি JSON ফাইল তৈরি করেছি। আমরা অ্যাপের উপাদান ফাইলটিতে যাব এবং নীচের কোডটি পেস্ট করব।

app.componal.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;

}

এখন আপনার অ্যাঙ্গুলার 7 অ্যাপ্লিকেশন স্থানীয় জেএসএন ফাইল থেকে ডেটা পরিবেশন করতে প্রস্তুত।

App.componal.html এ যান এবং এতে নিম্নলিখিত কোডটি আটকে দিন।

app.componal.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>

0

টাইপস্ক্রিপ্ট ৩..3.৩, এবং কৌণিক Using ব্যবহার করে, এই সমাধানগুলির কোনওটিই আমার পক্ষে কার্যকর হয়নি।

কি করেনি কাজ টিউটোরিয়াল অনুসরণ করতে ছিল এখানে যা বলেছেন আপনি একটি ছোট ফাইল নামক যোগ করতে হবে njson-typings.d.tsআপনার প্রকল্পের, এই ধারণকারী:

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

এটি হয়ে গেলে, আমি কেবল আমার হার্ডকোডযুক্ত জসন ডেটা আমদানি করতে পারি:

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;
    . . . .
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.