গ্লোবাল ধ্রুবকগুলি সংজ্ঞায়িত করুন


258

কৌণিক 1.x এ আপনি ধ্রুবকগুলি সংজ্ঞায়িত করতে পারেন:

angular.module('mainApp.config', [])
    .constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/')

কৌণিক (টাইপস্ক্রিপ্ট সহ) এর সমতুল্য কী হবে?

আমি কেবল আমার সমস্ত পরিষেবাদিতে এপিআই বেস url বারবার পুনরাবৃত্তি করতে চাই না।

উত্তর:


265

নীচে পরিবর্তনগুলি আমার জন্য কৌনিক 2 চূড়ান্ত সংস্করণে কাজ করে:

export class AppSettings {
   public static API_ENDPOINT='http://127.0.0.1:6666/api/';
}

এবং তারপরে পরিষেবা:

import {Http} from 'angular2/http';
import {Message} from '../models/message';
import {Injectable} from 'angular2/core';
import {Observable} from 'rxjs/Observable';
import {AppSettings} from '../appSettings';
import 'rxjs/add/operator/map';

@Injectable()
export class MessageService {

    constructor(private http: Http) { }

    getMessages(): Observable<Message[]> {
        return this.http.get(AppSettings.API_ENDPOINT+'/messages')
            .map(response => response.json())
            .map((messages: Object[]) => {
                return messages.map(message => this.parseData(message));
            });
    }

    private parseData(data): Message {
        return new Message(data);
    }
}

আমি মনে করি আপনার AppSettingsক্লাসটি বিমূর্ত API_ENDPOINTহওয়া উচিত এবং সদস্য হওয়া উচিত readonly
ফিলিপ জিওসিফি

164

কৌণিক দল নিজেই সরবরাহ করেছে কনফিগারেশনের সমাধানটি এখানে পাওয়া যাবে

এখানে সমস্ত প্রাসঙ্গিক কোড দেওয়া হল:

1) app.config.ts

import { OpaqueToken } from "@angular/core";

export let APP_CONFIG = new OpaqueToken("app.config");

export interface IAppConfig {
    apiEndpoint: string;
}

export const AppConfig: IAppConfig = {    
    apiEndpoint: "http://localhost:15422/api/"    
};

2) app.module.ts

import { APP_CONFIG, AppConfig } from './app.config';

@NgModule({
    providers: [
        { provide: APP_CONFIG, useValue: AppConfig }
    ]
})

3) your.service.ts

import { APP_CONFIG, IAppConfig } from './app.config';

@Injectable()
export class YourService {

    constructor(@Inject(APP_CONFIG) private config: IAppConfig) {
             // You can use config.apiEndpoint now
    }   
}

এখন আপনি স্ট্রিংয়ের নাম ব্যবহার না করে এবং স্ট্যাটিক চেকগুলির জন্য আপনার ইন্টারফেসের ব্যবহার ছাড়াই সর্বত্র কনফিগার করতে পারেন ject

উত্পাদন এবং বিকাশের বিভিন্ন মান সরবরাহ করতে সক্ষম হওয়ার জন্য আপনি অবশ্যই ইন্টারফেস এবং ধ্রুবকটিকে পৃথক করতে পারেন উদাহরণস্বরূপ


3
এটি কেবল তখনই কাজ করে যখন আমি পরিষেবাটির নির্মাণকারীর মধ্যে ধরণটি নির্দিষ্ট না করি। সুতরাং আমি যখন কনস্ট্রাক্টর (@ ইনজেক্ট (অ্যাপ্লিকেশন (অ্যাপ্লিকেশন_সিএনএফআইজি)) ব্যক্তিগত কনফিগারেশন করি তখন এটি কাজ করে {here এখানে এর একটি উল্লেখ রয়েছে: ব্লগ.থচট্রাম.আইও / অ্যাঙ্গুলার / 2016 / 05 / 23/… তবে কেন নয়।
মুকুস

আমি মনে করি আপনি কিছু আমদানি বা রফতানি কীওয়ার্ড বা এর মতো কিছু মিস করেছেন, যেহেতু আমি এটি ইন্টারফেসের সাথে ব্যবহার করি এবং এটি যেমন আপনি স্পষ্টভাবে স্ট্যাটিকালি টাইপ করা খুব গুরুত্বপূর্ণ বলেছিলেন। হয়তো আপনাকে এখানে সঠিক ব্যতিক্রম সরবরাহ করতে হবে।
ইলিয়া চেরনমর্ডিক

46
এই সমাধানগুলির কোনওটিই নয়, এমনকি কৌণিক দল প্রস্তাবিত পদ্ধতির মার্জিত দেখায়। কেন কৌণিক 2 এ ধ্রুবকগুলি একটি জটিল প্রক্রিয়া তৈরি করার চেষ্টা করছে? আপনি দেখতে পাচ্ছেন না কীভাবে নির্বিঘ্ন এঙ্গুলার 1 এটি করেছে? সব গণ্ডগোল কেন?
খোফি

31
এই উত্তরটি হিট করে এমন যে কারও জন্য কৌণিক ভি 4-এ ওপাক টোকেন
ব্লগ.থট্রাম.ইম

3
পদক্ষেপ 1 থেকে কোডটি স্থাপন করা কী বোঝায় environment.tsএবং environment.prod.tsযাতে আপনার প্রতি পরিবেশের জন্য বিভিন্ন ধ্রুবক থাকতে পারে? @ ইলিয়াচর্নমর্ডিক তার উত্তরের শেষ অনুচ্ছেদে এটি উল্লেখ করা শুরু করেছিলেন।
রবার্ট বার্নস্টেইন

64

Angular2 এ আপনার নীচের সরবরাহের সংজ্ঞা রয়েছে যা আপনাকে বিভিন্ন ধরণের নির্ভরতা সেটআপ করতে দেয়:

provide(token: any, {useClass, useValue, useExisting, useFactory, deps, multi}

কৌনিক 1 এর সাথে তুলনা করা

app.serviceAngular1 এ Angular2 এর সমান useClass

app.factoryAngular1 এ Angular2 এর সমান useFactory

app.constantএবং কম বাধা দিয়ে app.valueসরলীকৃত করা হয়েছে useValue। অর্থাত্ configআর কোনও ব্লক নেই।

app.provider - কৌণিক 2 এর সমতুল্য নেই।

উদাহরণ

রুট ইনজেক্টর দিয়ে সেটআপ করতে:

bootstrap(AppComponent,[provide(API_ENDPOINT, { useValue='http://127.0.0.1:6666/api/' })]);

অথবা আপনার উপাদানটির ইনজেক্টর সহ সেটআপ করুন:

providers: [provide(API_ENDPOINT, { useValue: 'http://127.0.0.1:6666/api/'})]

provide এর জন্য সংক্ষিপ্ত হাত:

var injectorValue = Injector.resolveAndCreate([
  new Provider(API_ENDPOINT, { useValue: 'http://127.0.0.1:6666/api/'})
]);

ইনজেক্টর সহ, মান পাওয়া সহজ:

var endpoint = injectorValue.get(API_ENDPOINT);

2
আমি আসলে আমার সেটিংস একটি বাহ্যিক ফাইলে রাখতে চাই যেমন: सेटिंग्ज.ts এই ফাইলটি কেমন দেখাচ্ছে?
আন্দ্রেফিজো

আপনি কি সার্ভার-সাইড জাভাস্ক্রিপ্ট যেমন নোডজেএস হিসাবে বিবেচনা করেছেন?
পিক্সিটসেট

5
দুঃখিত, আমি কীভাবে এটি আমার পরিষেবাতে ইনজেকশনে যাচ্ছি তা আমি বুঝতে পারি নি? আমি যেমন একটি বাহ্যিক ফাইল ব্যবহার করছি, আমার কি তা রফতানি করা দরকার?
আন্দ্রেফিজো

আমি এটিকে আপনার বিল্ড কনফিগারেশন প্রক্রিয়ার অংশ করব। যেমন আপনার পরিবেশের উপর ভিত্তি করে, বিভিন্ন ফাইল একসাথে সংকলন / প্যাকেজ করুন, তারপরে মোতায়েন করুন। এই সমস্ত কিছুই আপনি সঠিক মডিউলগুলির সাথে নোডজেএসের সাথে করতে পারেন।
পিক্সেলবিট

1
দুর্ভাগ্যক্রমে নোডজেএস কোনও বিকল্প নয়।
আন্দ্রেফিজো

59

কৌনিক 4 এ, আপনি আপনার সমস্ত গ্লোবাল রাখতে পরিবেশ বর্গ ব্যবহার করতে পারেন।

ডিফল্টরূপে আপনার এনভায়রনমেন্ট.টস এবং এনভায়রনমেন্ট.প্রড।

উদাহরণ স্বরূপ

export const environment = {
  production: false,
  apiUrl: 'http://localhost:8000/api/'
};

এবং তারপরে আপনার পরিষেবাতে:

import { environment } from '../../environments/environment';
...
environment.apiUrl;

আপনি যদি একটি একসেস করতে চেষ্টা করছেন তাহলে const: একটি সেবা ভেতরে, আপনি এটি "প্রদান" আপনার অ্যাপ মডিউল এর প্রদানকারীর অ্যারের মধ্যে করতে হতে পারে { provide: 'ConstName', useValue: ConstName }। এটি ছাড়া আমি রানটাইম ত্রুটি পেয়েছি।
daleyjem

@ ড্যালিয়েজেম এর কারণ আপনি এটি ইনজেক্ট করার চেষ্টা করছেন। এই পদ্ধতিটি ইনজেক্টর ব্যবহার করে না
আলুয়ান হাদাদ

এর মতো ধ্রুবক তৈরি করা সহজতম। আমার ধারণা, ডিআই কে হারাতে এবং এর মাধ্যমে টেস্টাবিলিটি / মকভ্যালু হ্রাস করার পক্ষে কিছুটা সময় অতি-হাইপাইড। সাধারণ অ্যাপ্লিকেশনটিতে আমরা পরীক্ষার যোগ্যতা বিরক্ত না করে অনেকগুলি নন-ডিআই উপাদান (আরএক্সজেএস) ব্যবহার করি।
অমিতেশ

54

কৌণিক 4+ এর জন্য আপডেট হয়েছে

এখন আমরা সহজেই এনভায়রনমেন্ট ফাইল ব্যবহার করতে পারি যা আপনার প্রকল্পটি কৌণিক-ক্লাইমের মাধ্যমে উত্পন্ন হলে কোনও কৌণিক ডিফল্ট সরবরাহ করে ang

উদাহরণ স্বরূপ

আপনার পরিবেশ ফোল্ডারে নিম্নলিখিত ফাইলগুলি তৈরি করুন

  • environment.prod.ts
  • environment.qa.ts
  • environment.dev.ts

এবং প্রতিটি ফাইল সম্পর্কিত কোড পরিবর্তনগুলি ধরে রাখতে পারে যেমন:

  • environment.prod.ts

    export const environment = {
         production: true,
         apiHost: 'https://api.somedomain.com/prod/v1/',
         CONSUMER_KEY: 'someReallyStupidTextWhichWeHumansCantRead', 
         codes: [ 'AB', 'AC', 'XYZ' ],
    };
  • environment.qa.ts

    export const environment = {
         production: false,
         apiHost: 'https://api.somedomain.com/qa/v1/',
         CONSUMER_KEY : 'someReallyStupidTextWhichWeHumansCantRead', 
         codes: [ 'AB', 'AC', 'XYZ' ],
    };
  • environment.dev.ts

    export const environment = {
         production: false,
         apiHost: 'https://api.somedomain.com/dev/v1/',
         CONSUMER_KEY : 'someReallyStupidTextWhichWeHumansCantRead', 
         codes: [ 'AB', 'AC', 'XYZ' ],
    };

প্রয়োগ ক্ষেত্রে ব্যবহার

আপনি যেকোন ফাইল যেমন পরিবেশ হিসাবে পরিবেশ আমদানি করতে পারেন clientUtilServices.ts

import {environment} from '../../environments/environment';

getHostURL(): string {
    return environment.apiHost;
  }

ব্যবহারের ক্ষেত্রে নির্মিত

আপনার কৌনিক ক্লাই ফাইলটি খুলুন .angular-cli.jsonএবং এর অভ্যন্তরে "apps": [{...}]নিম্নলিখিত কোড যুক্ত করুন

 "apps":[{
        "environments": {
            "dev": "environments/environment.ts",
            "prod": "environments/environment.prod.ts",
            "qa": "environments/environment.qa.ts",
           }
         }
       ]

আপনি যদি উত্পাদনের জন্য তৈরি করতে চান তবে চালান ng build --env=prodএটি থেকে কনফিগারেশনটি পড়বে environment.prod.ts, আপনি এটির জন্য qaবা এটি করতে পারেন waydev

## পুরানো উত্তর

আমি আমার সরবরাহকারীর নীচে যেমন কিছু করছি:

import {Injectable} from '@angular/core';

@Injectable()
export class ConstantService {

API_ENDPOINT :String;
CONSUMER_KEY : String;

constructor() {
    this.API_ENDPOINT = 'https://api.somedomain.com/v1/';
    this.CONSUMER_KEY = 'someReallyStupidTextWhichWeHumansCantRead'
  }
}

তারপরে আমার কাছে যে কোনও স্থানে সমস্ত কনস্ট্যান্ট ডেটা অ্যাক্সেস রয়েছে

import {Injectable} from '@angular/core';
import {Http} from '@angular/http';
import 'rxjs/add/operator/map';

import {ConstantService} from  './constant-service'; //This is my Constant Service


@Injectable()
export class ImagesService {
    constructor(public http: Http, public ConstantService: ConstantService) {
    console.log('Hello ImagesService Provider');

    }

callSomeService() {

    console.log("API_ENDPOINT: ",this.ConstantService.API_ENDPOINT);
    console.log("CONSUMER_KEY: ",this.ConstantService.CONSUMER_KEY);
    var url = this.ConstantService.API_ENDPOINT;
    return this.http.get(url)
  }
 }

6
এটি কনস্ট্যান্টের মতো কাজ করে না। ধ্রুবকের মান সর্বদা সমান। আপনার ক্ষেত্রে, আপনার API_ENDPOINTমান যে কোনও সময় অতিরিক্ত লেখা যেতে পারে। যদি this.ConstantService.API_ENDPOINT = 'blah blah'বর্গ যেকোনো সময়ে আপনার তথাকথিত 'ধ্রুবক "পরে ঘোষণা করা থেকে আমদানি করা হয় constant-service, API_ENDPOINT নতুন মান হতে হবে 'blah blah'। আপনার সমাধানটি কেবল কোনও ধ্রুবক ব্যবহার না করে একটি পরিষেবা ব্যবহার করে ভেরিয়েবল অ্যাক্সেস করতে পারে তা দেখায়।
ডেভেনার

1
@ ডেভনার কেবল এগুলিকে কেবল পঠনযোগ্য করে তুলবেনreadonly API_ENDPOINT :String;
ফ্ল্যাভিয়ান ভলকেন

@ আঞ্জুম কীভাবে কৌণিক এনভীভ ফাইলগুলি নির্বাচন করে। আমার অ্যাপ্লিকেশন শুরু করার সময় এনভির নাম পাস করা উচিত?
notionquest

@ নটিওনকোয়েস্ট হ্যাঁ আপনি এটি পাস করতে পারেন, যেমনng build --env=prod
আনজুম ....

31

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

আমাদের এপিআই শেষ পয়েন্টগুলি আমাদের পরিষেবাগুলিতে ইনজেক্ট করতে সক্ষম হওয়া প্রয়োজন (কোনও পরিষেবাতে অন্য কোনও পরিষেবাতে ইনজেকশন দেওয়ার কথা ভাবেন)। আমাদের এটির জন্য একটি সম্পূর্ণ ক্লাস তৈরি করার দরকার নেই, আমরা যা করতে চাই তা হ'ল আমাদের অ্যাপ্লিকেশনগুলিতে আমাদের পরিষেবাগুলির মধ্যে একটি স্ট্রিং ইনজেক্ট করা। পিক্সেলবিট দ্বারা দুর্দান্ত উত্তরটি সম্পূর্ণ করতে , এটি কৌনিক 2 এ কীভাবে করা যায় তার সম্পূর্ণ কোড এখানে রয়েছে:

আমরা প্রথমে কৌণিক বলতে কিভাবে প্রয়োজন প্রদান আমাদের ApiEndpoint একটি দৃষ্টান্ত যখন আমরা আমাদের অ্যাপ্লিকেশন (ক নির্ভরতা নিবন্ধনের হিসাবে মনে) এটা জন্য অনুরোধ:

bootstrap(AppComponent, [
        HTTP_PROVIDERS,
        provide('ApiEndpoint', {useValue: 'http://127.0.0.1:6666/api/'})
]);         


এবং তারপরে পরিষেবার মধ্যে আমরা এই এপিআইএন্ডপয়েন্টটি পরিষেবাটি নির্মাণকারীতে ইনজেক্ট করি এবং কৌণিক আমাদের উপরে আমাদের নিবন্ধের ভিত্তিতে এটি সরবরাহ করবে:

import {Http} from 'angular2/http';
import {Message} from '../models/message';
import {Injectable, Inject} from 'angular2/core';  // * We import Inject here
import {Observable} from 'rxjs/Observable';
import {AppSettings} from '../appSettings';
import 'rxjs/add/operator/map';

@Injectable()
export class MessageService {

    constructor(private http: Http, 
                @Inject('ApiEndpoint') private apiEndpoint: string) { }

    getMessages(): Observable<Message[]> {
        return this.http.get(`${this.apiEndpoint}/messages`)
            .map(response => response.json())
            .map((messages: Object[]) => {
                return messages.map(message => this.parseData(message));
            });
    } 
    // the rest of the code...
}

1
তাদের টিউটোরিয়ালে কৌণিক দল দ্বারা সুপারিশ করার একটি "অফিসিয়াল" উপায় রয়েছে। আমি নীচে একটি উত্তর যুক্ত করেছি: ( স্ট্যাকওভারফ্লো.com / a / 40287063 / 1671558 )
ইলিয়া চেরনমর্ডিক

1
এই কোডটি আর সঠিক নয়, এটি প্রয়োগ করে অ্যাপকোম্পোন্টে কোনও এপিআইপয়েন্টটি পাওয়া যায়নি।
উইলিয়ামএক্স

ঠিক আছে তাই আমি একা নই আপনি কি জানেন যে এটি কোন সংস্করণটি ভেঙে গেছে? এমন কোনও বিকল্প উপায় আছে যার জন্য কোনও গ্লোবাল অবজেক্টের মান নির্ধারণের পরে তাদের সরবরাহের প্রয়োজন হয় না?
জেনস বোডাল

29

এই দৃশ্যের সাথে এটি আমার সাম্প্রতিক অভিজ্ঞতা:

  • @ কৌণিক / ক্লিপ: 1.0.0
  • নোড: 6.10.2
  • @ কৌণিক / কোর: 4.0.0

আমি এখানে অফিসিয়াল এবং আপডেট ডক্স অনুসরণ করেছি:

https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#dependency-injection-tokens

দেখে মনে হচ্ছে ওপাউক টোকেন এখন অবহিত এবং আমাদের অবশ্যই ইনজেকশনটোকেন ব্যবহার করতে হবে , সুতরাং এগুলি আমার ফাইলগুলি কবজির মতো চলছে:

app-config.interface.ts

export interface IAppConfig {

  STORE_KEY: string;

}

app-config.constants.ts

import { InjectionToken } from "@angular/core";
import { IAppConfig } from "./app-config.interface";

export const APP_DI_CONFIG: IAppConfig = {

  STORE_KEY: 'l@_list@'

};

export let APP_CONFIG = new InjectionToken< IAppConfig >( 'app.config' );

app.module.ts

import { APP_CONFIG, APP_DI_CONFIG } from "./app-config/app-config.constants";

@NgModule( {
  declarations: [ ... ],
  imports: [ ... ],
  providers: [
    ...,
    {
      provide: APP_CONFIG,
      useValue: APP_DI_CONFIG
    }
  ],
  bootstrap: [ ... ]
} )
export class AppModule {}

my-service.service.ts

  constructor( ...,
               @Inject( APP_CONFIG ) private config: IAppConfig) {

    console.log("This is the App's Key: ", this.config.STORE_KEY);
    //> This is the App's Key:  l@_list@

  }

ফলাফলটি পরিষ্কার এবং এই ইস্যুতে জন পাপের সাম্প্রতিক মন্তব্যে কনসোলকে ধন্যবাদ জানাতে কোনও সতর্কতা নেই:

https://github.com/angular/angular-cli/issues/2034

ইন্টারফেসের বিভিন্ন ফাইলটিতে কীটি প্রয়োগ করা হয়েছিল।


আরো দেখুন stackoverflow.com/a/43193574/3092596 - যা মূলত একই, কিন্তু প্রদানকারীর চেয়ে ইঞ্জেকশনভিত্তিক মডিউল তৈরি করে
goredwards

19

সমস্ত সমাধান জটিল বলে মনে হচ্ছে। আমি এই মামলার সহজ সমাধান খুঁজছি এবং আমি কেবল ধ্রুবক ব্যবহার করতে চাই। ধ্রুবকগুলি সহজ। নিম্নলিখিত সমাধানের বিরুদ্ধে কথা বলার কিছু আছে কি?

app.const.ts

'use strict';

export const dist = '../path/to/dist/';

app.service.ts

import * as AppConst from '../app.const'; 

@Injectable()
export class AppService {

    constructor (
    ) {
        console.log('dist path', AppConst.dist );
    }

}

2
ঠিক আছে, আপনি পরিষেবার ক্ষেত্রের বাইরে ভেরিয়েবলগুলি ব্যবহার করছেন যাতে আপনি কেবল তখন উইন্ডো গ্লোবালগুলি ব্যবহার করতে পারেন। আমরা যা করার চেষ্টা করছি তা হ'ল অ্যাংুলার 4 নির্ভরতা ইনজেকশন সিস্টেমে ধ্রুবক হওয়া যাতে আমরা সুযোগটি পরিষ্কার, অনড় বা মজাদার রাখতে পারি।
জোয়েল হার্নান্দেজ

11

কেবল একটি টাইপস্ক্রিপ্ট ধ্রুবক ব্যবহার করুন

export var API_ENDPOINT = 'http://127.0.0.1:6666/api/';

আপনি এটি নির্ভরতা ইনজেক্টর ব্যবহার করে ব্যবহার করতে পারেন

bootstrap(AppComponent, [provide(API_ENDPOINT, {useValue: 'http://127.0.0.1:6666/api/'}), ...]);

1
কেন এটি ইনজেকশন? এর দরকার নেই বলে আমি মনে করি ... আপনি এটি আমদানি করার সাথে সাথে এটি ব্যবহার করতে পারবেন। @ স্নেয়ারচপস
সাসেক্সা

@ সাস্সা আমি সম্মত, যদিও এটি ইউনিট পরীক্ষার জন্য ভাল হতে পারে এবং এ জাতীয়। কেবল একটি সম্পূর্ণ উত্তর দেওয়ার চেষ্টা করছি।
SnareChops

1
@Andreas আপনি ব্যবহার করতে পারে constyest
SnareChops

দয়া করে এই কাজের স্ট্যাকব্লিটজ সরবরাহ করুন। আমি বুটস্ট্র্যাপ পদ্ধতিতে পরিষেবা সরবরাহের অনেক উদাহরণ দেখেছি তবে পর্যাপ্ত পরিশ্রমের উদাহরণ সহ একটি খুঁজে পাইনি। সম্ভবত কৌণিকের আরও সাম্প্রতিক সংস্করণে কিছু পরিবর্তন হয়েছে।
জেনস বোডাল

4

আপনি যদি ওয়েবপ্যাকটি ব্যবহার করেন , যা আমি প্রস্তাব দিচ্ছি, আপনি বিভিন্ন পরিবেশের জন্য ধ্রুবক সেট আপ করতে পারেন। এটি বিশেষত মূল্যবান যখন আপনার প্রতি পরিবেশের ভিত্তিতে বিভিন্ন ধ্রুবক মান থাকে।

আপনার কাছে সম্ভবত আপনার /configডিরেক্টরিতে একাধিক ওয়েবপ্যাক ফাইল থাকবে (যেমন, ওয়েবপ্যাক.ড্যাভ.জেএস, ওয়েবপ্যাক.প্রড.জে, ইত্যাদি)। তারপরে আপনার একটি হবেcustom-typings.d.ts আপনি সেগুলি সেখানে যুক্ত করবেন। এখানে প্রতিটি ফাইল অনুসরণ করার জন্য সাধারণ প্যাটার্ন এবং একটি উপাদানটিতে একটি নমুনা ব্যবহার রয়েছে।

webpack। {env} .js

const API_URL = process.env.API_URL = 'http://localhost:3000/';
const JWT_TOKEN_NAME = "id_token";
...
    plugins: [
      // NOTE: when adding more properties, make sure you include them in custom-typings.d.ts
      new DefinePlugin({
        'API_URL': JSON.stringify(API_URL),
        'JWT_TOKEN_NAME': JSON.stringify(JWT_TOKEN_NAME)
      }),

কাস্টম typings.d.ts

declare var API_URL: string;
declare var JWT_TOKEN_NAME: string;
interface GlobalEnvironment {
  API_URL: string;
  JWT_TOKEN_NAME: string;
}

উপাদান

export class HomeComponent implements OnInit {
  api_url:string = API_URL;
  authToken: string = "Bearer " + localStorage.getItem(JWT_TOKEN_NAME)});
}

3

একটি বিল্ড চলাকালীন উত্পন্ন উত্স ফাইলটি ব্যবহার করা সহজ এবং সহজ। এটি অ্যাঙ্গুলার সিএলআই ব্যবহার করে। প্রতিটি পরিবেশের জন্য একটি সম্পত্তি ফাইল সংজ্ঞায়িত করুন এবং আপনার অ্যাপ্লিকেশনটিতে কোন ফাইল অনুলিপি করা হয়েছে তা নির্ধারণের জন্য একটি কমান্ড ব্যবহার করুন। তারপরে ব্যবহার করার জন্য কেবল সম্পত্তি ফাইলটি আমদানি করুন।

https://github.com/angular/angular-cli#build-targets-and-environment-files


3

Angular4 এর জন্য একটি পদ্ধতির মডিউল স্তরে একটি ধ্রুবক সংজ্ঞায়িত করা হবে:

const api_endpoint = 'http://127.0.0.1:6666/api/';

@NgModule({
  declarations: [AppComponent],
  bootstrap: [AppComponent],
  providers: [
    MessageService,
    {provide: 'API_ENDPOINT', useValue: api_endpoint}
  ]
})
export class AppModule {
}

তারপরে, আপনার পরিষেবাতে:

import {Injectable, Inject} from '@angular/core';

@Injectable()
export class MessageService {

    constructor(private http: Http, 
      @Inject('API_ENDPOINT') private api_endpoint: string) { }

    getMessages(): Observable<Message[]> {
        return this.http.get(this.api_endpoint+'/messages')
            .map(response => response.json())
            .map((messages: Object[]) => {
                return messages.map(message => this.parseData(message));
            });
    }

    private parseData(data): Message {
        return new Message(data);
    }
}

3

আমার কাছে বিশ্বব্যাপী ধ্রুবকগুলি সংজ্ঞায়নের আরও একটি উপায় রয়েছে। কারণ আমরা যদি টিএস ফাইলে সংজ্ঞায়িত করে থাকি তবে যদি উত্পাদন মোডে তৈরি হয় তবে মান পরিবর্তন করার জন্য ধ্রুবকগুলি খুঁজে পাওয়া সহজ নয় not

export class SettingService  {

  constructor(private http: HttpClient) {

  }

  public getJSON(file): Observable<any> {
      return this.http.get("./assets/configs/" + file + ".json");
  }
  public getSetting(){
      // use setting here
  }
}

অ্যাপ ফোল্ডারে, আমি ফোল্ডার কনফিগারেশন / সেটিং.জসন যুক্ত করি

সেটিং.জসনে সামগ্রী

{
    "baseUrl": "http://localhost:52555"
}

অ্যাপ্লিকেশন মডিউলে APP_INITIALIZER যুক্ত করুন

   {
      provide: APP_INITIALIZER,
      useFactory: (setting: SettingService) => function() {return setting.getSetting()},
      deps: [SettingService],
      multi: true
    }

এইভাবে, আমি সহজেই জেসন ফাইলে মান পরিবর্তন করতে পারি। ধ্রুবক ত্রুটি / সতর্কতা বার্তাগুলির জন্যও আমি এইভাবে ব্যবহার করি।


0

AngularJS এর module.constant স্ট্যান্ডার্ড অর্থে একটি ধ্রুবককে সংজ্ঞায়িত করে না।

সরবরাহকারীর নিবন্ধকরণ প্রক্রিয়া হিসাবে এটি নিজেরাই দাঁড়িয়ে থাকলেও সম্পর্কিত module.value( $provide.value) ফাংশনের প্রসঙ্গে এটি ভালভাবে বোঝা যায় । অফিসিয়াল ডকুমেন্টেশন ব্যবহারের ক্ষেত্রে পরিষ্কারভাবে বলেছে:

$ ইনজেক্টর সহ একটি মান পরিষেবা নিবন্ধ করুন, যেমন স্ট্রিং, একটি সংখ্যা, একটি অ্যারে, কোনও বস্তু বা কোনও ফাংশন। এটি এমন কোনও পরিষেবার নিবন্ধনের জন্য সংক্ষিপ্ত যেখানে এর সরবরাহকারীর $ সম্পত্তি পাওয়া একটি কারখানা ফাংশন যা কোনও যুক্তি গ্রহণ করে না এবং মান পরিষেবাটি ফেরত দেয়। এর অর্থ হ'ল অন্যান্য পরিষেবাদি কোনও মান পরিষেবাতে ইনজেক্ট করা সম্ভব নয়।

module.constant( $provide.constant) এর জন্য ডকুমেন্টেশনের সাথে এটির তুলনা করুন যা ব্যবহারের ক্ষেত্রে (জোর দিয়ে খনি) স্পষ্টভাবে জানিয়েছে:

$ ইনজেক্টরের সাথে একটি ধ্রুবক পরিষেবা নিবন্ধ করুন, যেমন স্ট্রিং, সংখ্যা, একটি অ্যারে, কোনও বস্তু বা কোনও ফাংশন। মানটির মতো, অন্যান্য পরিষেবাদিগুলিকে ধ্রুবক হিসাবে ইনজেক্ট করা সম্ভব নয়। তবে মানটির বিপরীতে, একটি ধ্রুবককে একটি মডিউল কনফিগারেশন ফাংশনে ইনজেকশন করা যায় (দেখুন কৌণিক.মডিউল) এবং এটি কোনও কৌণিক জেএস ডেকরেটর দ্বারা ওভাররাইড করা যায় না

সুতরাং, AngularJS constantফাংশনটি ক্ষেত্রের শব্দটির সাধারণ বোঝা যায় এমন অর্থের মধ্যে একটি ধ্রুবক সরবরাহ করে না।

এটি বলেছিল যে সরবরাহকৃত অবজেক্টের উপর the ইনজেক্টরের মাধ্যমে পূর্বের প্রাপ্যতার সাথে একত্রিত হওয়া বিধিনিষেধগুলি পরিষ্কারভাবে প্রস্তাব দেয় যে নামটি সাদৃশ্য দ্বারা ব্যবহৃত হয়েছে।

আপনি যদি একটি কৌণিক জেএস অ্যাপ্লিকেশনটিতে সত্যিকারের ধ্রুবক চেয়েছিলেন, আপনি যে কোনও জাভাস্ক্রিপ্ট প্রোগ্রামে যা করেছেন ঠিক তেমনই একটি "সরবরাহ" করতেন is

export const π = 3.14159265;

কৌণিক 2 এ, একই কৌশল প্রযোজ্য।

কৌণিক 2 অ্যাপ্লিকেশনগুলির ক্ষেত্রে কৌণিক জেএস অ্যাপ্লিকেশনগুলির অনুরূপ কোনও কনফিগারেশন পর্ব নেই। তদ্ব্যতীত, কোনও পরিষেবা সাজসজ্জার ব্যবস্থা নেই ( AngularJS ডেকোরেটর ) তবে তারা একে অপরের থেকে কতটা পৃথক, তা দেওয়া বিশেষত অবাক হওয়ার মতো নয়।

এর উদাহরণ

angular
  .module('mainApp.config', [])
  .constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/');

অস্পষ্টভাবে নির্বিচারে এবং সামান্য অফ-পপিং কারণ ঘটনাক্রমে এছাড়াও একটি ধ্রুবক $provide.constantযে কোনও বস্তু নির্দিষ্ট করতে ব্যবহৃত হচ্ছে । আপনি পাশাপাশি লিখতে পারে

export const apiEndpoint = 'http://127.0.0.1:6666/api/';

সবার জন্য হয় পরিবর্তন করতে পারেন।

টেস্টিবিলিটির পক্ষে যুক্তি, ধ্রুবকটিকে উপহাস করে হ্রাস করা হয় কারণ এটি আক্ষরিকভাবে পরিবর্তিত হয় না।

কেউ উপহাস করে না π

অবশ্যই আপনার অ্যাপ্লিকেশন সুনির্দিষ্ট শব্দার্থবিজ্ঞান হতে পারে যে আপনার শেষ পয়েন্টটি পরিবর্তিত হতে পারে, বা আপনার এপিআই-তে স্বচ্ছ-ব্যর্থতা প্রক্রিয়া থাকতে পারে, তাই এপিআই শেষ পয়েন্টটি নির্দিষ্ট পরিস্থিতিতে পরিবর্তন করা যুক্তিসঙ্গত হবে।

তবে সেক্ষেত্রে এটিকে constantফাংশনে একটি একক URL এর স্ট্রিং আক্ষরিক উপস্থাপন হিসাবে সরবরাহ করা কাজ করবে না।

আরও ভাল যুক্তি, এবং সম্ভবত আরও একটি অ্যাঙ্গুলারজেএস $provide.constantফাংশনটির অস্তিত্বের কারণের সাথে একত্রিত হয় , যখন অ্যাংুলারজেএস চালু হয়েছিল, জাভাস্ক্রিপ্টটির কোনও মানক মডিউল ধারণা ছিল না । সেক্ষেত্রে গ্লোবালগুলি মানগুলি ভাগ করতে ব্যবহৃত হবে, পরিবর্তনীয় বা অপরিবর্তনীয় এবং গ্লোবালগুলি ব্যবহার করা সমস্যাযুক্ত।

এটি বলেছিল, একটি ফ্রেমওয়ার্কের মাধ্যমে এরকম কিছু সরবরাহ করা সেই কাঠামোর সাথে সংযুক্তি বাড়িয়ে তোলে। এটি কৌনিক নির্দিষ্ট যুক্তিকে যুক্তির সাথেও মিশ্রিত করে যা অন্য কোনও সিস্টেমে কাজ করবে।

এটি এটি একটি ভুল বা ক্ষতিকারক পদ্ধতির বলার নয়, তবে ব্যক্তিগতভাবে, আমি যদি কৌনিক 2 অ্যাপ্লিকেশনটিতে ধ্রুবক চাই , আমি লিখব

export const π = 3.14159265;

আমি যেমন ছিলাম ঠিক তেমনই আমি AngularJS ব্যবহার করছিলাম।

আরও জিনিস পরিবর্তন ...


0

অ্যাংুলার 2 এ অ্যাপ্লিকেশন প্রশস্ত স্থিতিশীল তৈরি করার সর্বোত্তম উপায় হ'ল এনভায়রনমেন্টস ফাইল ব্যবহার করে। এই ধরণের স্থিরতা ঘোষণার সুবিধা হ'ল আপনি পরিবেশ অনুসারে সেগুলি পৃথক করতে পারেন কারণ প্রতিটি পরিবেশের জন্য আলাদা পরিবেশ ফাইল থাকতে পারে।


আপনি যদি একবার আপনার অ্যাপ্লিকেশনটি বানাতে চান তা কাজ করে না তবে এটি একাধিক পরিবেশে স্থাপন করুন।
জেনস বোডাল

-1

আপনি আপনার গ্লোবাল ভেরিয়েবলের জন্য একটি ক্লাস তৈরি করতে পারেন এবং তারপরে এই শ্রেণিটি রফতানি করতে পারেন:

export class CONSTANT {
    public static message2 = [
        { "NAME_REQUIRED": "Name is required" }
    ]

    public static message = {
        "NAME_REQUIRED": "Name is required",
    }
}

আপনার CONSTANTক্লাস তৈরি এবং রফতানি করার পরে , আপনার এই ক্লাসটি সেই শ্রেণিতে আমদানি করা উচিত যেখানে আপনি ব্যবহার করতে চান, এর মতো:

import { Component, OnInit                       } from '@angular/core';
import { CONSTANT                                } from '../../constants/dash-constant';


@Component({
  selector   : 'team-component',
  templateUrl: `../app/modules/dashboard/dashComponents/teamComponents/team.component.html`,
})

export class TeamComponent implements OnInit {
  constructor() {
    console.log(CONSTANT.message2[0].NAME_REQUIRED);
    console.log(CONSTANT.message.NAME_REQUIRED);
  }

  ngOnInit() {
    console.log("oninit");
    console.log(CONSTANT.message2[0].NAME_REQUIRED);
    console.log(CONSTANT.message.NAME_REQUIRED);
  }
}

আপনি এটি constructorবা হয় ngOnInit(){}বা কোনও পূর্বনির্ধারিত পদ্ধতিতে ব্যবহার করতে পারেন ।

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