दिलचस्प पोस्ट
त्रुटि: java.util.zip.ZipException: डुप्लिकेट प्रविष्टि LINQ लैम्ब्डा में कई तालिकाओं के बीच जुड़ने के लिए कैसे करें संग्रहित प्रक्रिया की वापसी मूल्य कैसे प्राप्त करें ईक्लीपस के कंसोल में बैकस्पेस \ b कैसे काम करें? कॉलिंग क्लोजर को सीधे ऑब्जेक्ट ऑब्जेक्ट करने के लिए भेजा गया आप पायथन में यूपी कैसे नंबर बनाते हैं? ऊपरी कैसे एक स्ट्रिंग में शब्द के प्रत्येक पहले अक्षर का केस? संग्रहीत कार्यप्रणाली, MySQL और PHP Inno सेटअप स्क्रिप्ट में HTTP पोस्ट अनुरोध आईएसओ 8601 दिनांक स्वरूप पार्सिंग जैसे 2015-06-27 टी 13: 16: 37.363 जे जावा में जावा से MySQL डाटाबेस बनाएँ क्या स्क्रिप्ट टैग के अंदर HTML टिप्पणियां एक सर्वोत्तम अभ्यास है? सामान्य ओवरलोडिंग के साथ जावा मिटाया जाना (अतिव्यापी नहीं) जेवीग्रीड पर वर्ड वर्प को कैसे कार्यान्वित करें जो आईई 7, आईई 8 और एफएफ पर काम करता है मैं php के साथ एक फ़ाइल का माइम-प्रकार कैसे प्राप्त करूं?

बैकएंड से कोणीय 2 बूटस्ट्रैप विधि को प्रदान किए गए मापदंडों को कैसे पार करें

क्या बैकएंड पर angular2 बूटस्ट्रैप विधि के लिए प्रदान किए गए तर्क पारित करने का कोई तरीका है? मैं बैकएंड से प्रदान किए गए मूल्य के साथ BaseRequestOptions का उपयोग करते हुए सभी अनुरोधों के लिए HTTP हेडर सेट करना चाहता हूं। मेरी main.ts फ़ाइल इस तरह दिखती है:

 import { bootstrap } from '@angular/platform-browser-dynamic'; import { AppComponent } from "./app.component.ts"; bootstrap(AppComponent); 

मुझे पता चला कि यह तर्क रूट घटक ( https://stackoverflow.com/a/35553650/3455681 ) को कैसे पास करें, लेकिन मुझे इसकी ज़रूरत है जब मैं bootstrap विधि चला रहा हूं … कोई विचार?

संपादित करें:

webpack.config.js सामग्री:

 module.exports = { entry: { app: "./Scripts/app/main.ts" }, output: { filename: "./Scripts/build/[name].js" }, resolve: { extensions: ["", ".ts", ".js"] }, module: { loaders: [ { test: /\.ts$/, loader: 'ts-loader' } ] } }; 

वेब के समाधान से एकत्रित समाधान "बैकएंड से कोणीय 2 बूटस्ट्रैप विधि को प्रदान किए गए मापदंडों को कैसे पार करें"

Update2

प्लंकर उदाहरण

एओटी अपडेट करें

एओईटी के साथ काम करने के लिए कारखाना बंद करने के लिए बाहर ले जाने की जरूरत है

 function loadContext(context: ContextService) { return () => context.load(); } @NgModule({ ... providers: [ ..., ContextService, { provide: APP_INITIALIZER, useFactory: loadContext, deps: [ContextService], multi: true } ], 

यह भी देखें https://github.com/angular/angular/issues/11262

एक आरसी 6 और 2.0.0 अंतिम उदाहरण अपडेट करें

 function configServiceFactory (config: ConfigService) { return () => config.load(); } @NgModule({ declarations: [AppComponent], imports: [BrowserModule, routes, FormsModule, HttpModule], providers: [AuthService, Title, appRoutingProviders, ConfigService, { provide: APP_INITIALIZER, useFactory: configServiceFactory deps: [ConfigService], multi: true } ], bootstrap: [AppComponent] }) export class AppModule { } 

यदि पूरा होने के लिए इंतजार करने की कोई ज़रूरत नहीं है, तो `कक्षा AppModule {} के निर्माता का भी उपयोग किया जा सकता है:

 class AppModule { constructor(/*inject required dependencies */) {...} } 

संकेत (चक्रीय निर्भरता)

उदाहरण के लिए रूटर इंजेक्शन के कारण चक्रीय निर्भरताएं हो सकती हैं। आसपास काम करने के लिए, Injector इंजेक्षन करें और निर्भरता प्राप्त करें

 this.myDep = injector.get(MyDependency); 

बजाय MyDependency इंजेक्शन के बजाय सीधे:

 @Injectable() export class ConfigService { private router:Router; constructor(/*private router:Router*/ injector:Injector) { setTimeout(() => this.router = injector.get(Router)); } } 

अद्यतन करें

यह आरसी 5 में एक ही काम करना चाहिए लेकिन प्रदाता को providers: [...] को जोड़ने के लिए providers: [...] bootstrap(...) बजाय रूट मॉड्यूल के bootstrap(...)

(अभी तक अपने आप को नहीं परीक्षण)।

अद्यतन करें

कोयोनरी में पूरी तरह से करने के लिए एक दिलचस्प दृष्टिकोण समझाया गया है https://github.com/angular/angular/issues/9047#issuecomment-224075188

आप APP_INITIALIZER उपयोग कर सकते हैं जो एप को आरम्भ करने के बाद एक फ़ंक्शन निष्पादित करेगा और फ़ंक्शन किसी वादे को लौटाता है, तो यह क्या प्रदान करता है। इसका अर्थ है कि एप काफी विलंब के बिना आरंभ हो सकता है और आप मौजूदा सेवाओं और फ्रेमवर्क सुविधाओं का भी उपयोग कर सकते हैं।

एक उदाहरण के रूप में, मान लीजिए आपके पास एक बहु-किरायेदार समाधान है जहां साइट की जानकारी उस डोमेन नाम पर निर्भर करती है जिसे इसे से परोसा जा रहा है। यह [नाम] .letterpress.com या एक कस्टम डोमेन हो सकता है जो पूर्ण मेजबाननाम पर मेल खाता है। हम इस तथ्य को छिपा सकते हैं कि यह APP_INITIALIZER का उपयोग करके एक वादा के पीछे है।

बूटस्ट्रैप में:

 {provide: APP_INITIALIZER, useFactory: (sites:SitesService) => () => sites.load(), deps:[SitesService, HTTP_PROVIDERS], multi: true}), 

sites.service.ts:

 @Injectable() export class SitesService { public current:Site; constructor(private http:Http, private config:Config) { } load():Promise<Site> { var url:string; var pos = location.hostname.lastIndexOf(this.config.rootDomain); var url = (pos === -1) ? this.config.apiEndpoint + '/sites?host=' + location.hostname : this.config.apiEndpoint + '/sites/' + location.hostname.substr(0, pos); var promise = this.http.get(url).map(res => res.json()).toPromise(); promise.then(site => this.current = site); return promise; } 

नोट: config सिर्फ एक कस्टम कॉन्फ़िग क्लास है rootDomain इस उदाहरण के लिए '.letterpress.com' होगा और aptaincodeman.letterpress.com

किसी भी घटक और अन्य सेवाओं में Site को उन में इंजेक्शन और .current संपत्ति का उपयोग किया जा सकता है जो एप के भीतर किसी वादे के इंतजार की कोई ज़रूरत नहीं होने के साथ ठोस आबादी वाला ऑब्जेक्ट होगा।

यह दृष्टिकोण स्टार्टअप विलंबता में कटौती कर रहा था जो अन्यथा काफी ध्यान देने योग्य था यदि आप बड़े कोनेरी बंडल को लोड करने के लिए प्रतीक्षा कर रहे थे और फिर बूटस्ट्रैप के शुरू होने से पहले एक अन्य http अनुरोध किया गया था।

मूल

आप इसे कांच का निर्भरता इंजेक्शन का प्रयोग कर सकते हैं:

 var headers = ... // get the headers from the server bootstrap(AppComponent, [{provide: 'headers', useValue: headers})]); 
 class SomeComponentOrService { constructor(@Inject('headers') private headers) {} } 

या सीधे तैयार किए गए BaseRequestOptions को तैयार करें

 class MyRequestOptions extends BaseRequestOptions { constructor (private headers) { super(); } } var values = ... // get the headers from the server var headers = new MyRequestOptions(values); bootstrap(AppComponent, [{provide: BaseRequestOptions, useValue: headers})]); 

अंगुलर 2 अंतिम रिलीज में, APP_INITIALIZER प्रदाता का उपयोग आप जो चाहें हासिल करने के लिए किया जा सकता है।

मैंने एक पूर्ण उदाहरण के साथ एक Gist लिखा: https://gist.github.com/fernandohu/122e88c3bcd210bbe41c608c36306db9

सारांश का उदाहरण JSON फ़ाइलों से पढ़ रहा है, लेकिन आसानी से एक अंतिम अंतबिंदु से पढ़ने के लिए बदल सकता है।

आपको क्या चाहिए, मूल रूप से:

क) अपने विद्यमान मॉड्यूल फ़ाइल में APP_INITIALIZER सेट करें:

 import { APP_INITIALIZER } from '@angular/core'; import { BackendRequestClass } from './backend.request'; import { HttpModule } from '@angular/http'; ... @NgModule({ imports: [ ... HttpModule ], ... providers: [ ... ... BackendRequestClass, { provide: APP_INITIALIZER, useFactory: (config: BackendRequestClass) => () => config.load(), deps: [BackendRequestClass], multi: true } ], ... }); 

ये लाइनें आपके एप्लिकेशन के शुरू होने से पहले BackendRequestClass वर्ग से लोड () विधि को कॉल करेगी।

सुनिश्चित करें कि आप "आयात" खंड में "एचटीटीपी मॉड्यूल" सेट करते हैं, यदि आप पुस्तकालय में बनाए गए कोणीय 2 का उपयोग करके बैकएंड को http कॉल करना चाहते हैं।

ख) एक वर्ग बनाएं और "backend.request.ts" फ़ाइल नाम दें:

 import { Inject, Injectable } from '@angular/core'; import { Http } from '@angular/http'; import { Observable } from 'rxjs/Rx'; @Injectable() export class BackendRequestClass { private result: Object = null; constructor(private http: Http) { } public getResult() { return this.result; } public load() { return new Promise((resolve, reject) => { this.http.get('http://address/of/your/backend/endpoint').map( res => res.json() ).catch((error: any):any => { reject(false); return Observable.throw(error.json().error || 'Server error'); }).subscribe( (callResult) => { this.result = callResult; resolve(true); }); }); } } 

ग) बैकेंड कॉल की सामग्री को पढ़ने के लिए, आपको बस किसी भी वर्ग में बैकएंडआरक्वेंस्ट क्लास को इंजेक्ट करने और getResult कॉल करने की आवश्यकता है ()। उदाहरण:

 import { BackendRequestClass } from './backend.request'; export class AnyClass { constructor(private backendRequest: BackendRequestClass) { // note that BackendRequestClass is injected into a private property of AnyClass } anyMethod() { this.backendRequest.getResult(); // This should return the data you want } } 

मुझे बताएं कि यह आपकी समस्या को हल करता है।

बूटस्ट्रैप को बुलाए जाने के बजाय अपनी प्रविष्टि बिन्दु होने के बजाय, आप उस फ़ंक्शन को बना और निर्यात कर सकते हैं जो काम करता है:

 export function doBootstrap(data: any) { platformBrowserDynamic([{provide: Params, useValue: new Params(data)}]) .bootstrapModule(AppModule) .catch(err => console.error(err)); } 

आप अपने फ़ंक्शन (वेबपैक / सिस्टमजेएस) के आधार पर, इस फ़ंक्शन को वैश्विक ऑब्जेक्ट पर भी रख सकते हैं। यह एओटी-संगत भी है

इसमें बूटस्ट्रैप को विलंब करने के लिए इसके अतिरिक्त लाभ है, जब यह समझ में आता है। उदाहरण के लिए, जब उपयोगकर्ता इस फॉर्म को भरता है, तो आप इस उपयोगकर्ता डेटा को एजेएक्स कॉल के रूप में पुनः प्राप्त करते हैं। बस इस डेटा के साथ निर्यात किए गए बूटस्ट्रैप फ़ंक्शन को कॉल करें

ऐसा करने का एकमात्र तरीका आपके प्रदाताओं को परिभाषित करते समय ये मूल्य प्रदान करना है:

 bootstrap(AppComponent, [ provide(RequestOptions, { useFactory: () => { return new CustomRequestOptions(/* parameters here */); }); ]); 

उसके बाद आप इन मानदंडों को अपने CustomRequestOptions वर्ग में उपयोग कर सकते हैं:

 export class AppRequestOptions extends BaseRequestOptions { constructor(parameters) { this.parameters = parameters; } } 

यदि आप एक एजेएक्स अनुरोध से इन पैरामीटर प्राप्त करते हैं, तो आपको इस तरह अतुल्यकालिक बूटस्ट्रैप की जरूरत है:

 var appProviders = [ HTTP_PROVIDERS ] var app = platform(BROWSER_PROVIDERS) .application([BROWSER_APP_PROVIDERS, appProviders]); var http = app.injector.get(Http); http.get('http://.../some path').flatMap((parameters) => { return app.bootstrap(appComponentType, [ provide(RequestOptions, { useFactory: () => { return new CustomRequestOptions(/* parameters here */); }}) ]); }).toPromise(); 

यह प्रश्न देखें:

  • एजेक्स कॉल से डेटा के साथ कोणीय 2 बूटस्ट्रैप

संपादित करें

चूंकि आपके पास एचटीएमएल में आपका डेटा है, इसलिए आप निम्न का उपयोग कर सकते हैं।

आप किसी फ़ंक्शन को आयात कर सकते हैं और पैरामीटर के साथ कॉल कर सकते हैं।

यहां मुख्य मॉड्यूल का एक नमूना है जो आपके आवेदन को बूटस्ट्रैप करता है:

 import {bootstrap} from '...'; import {provide} from '...'; import {AppComponent} from '...'; export function main(params) { bootstrap(AppComponent, [ provide(RequestOptions, { useFactory: () => { return new CustomRequestOptions(params); }); ]); } 

फिर आप इसे इस तरह अपने HTML मुख्य पृष्ठ से आयात कर सकते हैं:

 <script> var params = {"token": "@User.Token", "xxx": "@User.Yyy"}; System.import('app/main').then((module) => { module.main(params); }); </script> 

यह प्रश्न देखें: _layout.cshtml से कांच के लिए लगातार मान पास करें