2016-10-28 13 views
5

मैं DataResolver सेवा लिखने की कोशिश कर रहा हूं जो कोणीय 2 राउटर को मेरे घटक को शुरू करने से पहले डेटा को प्रीलोड करने की अनुमति देगा।कोणीय 2: मार्ग डेटा के लिए एक मान पास करें

रिज़ॉल्यूवर को लोड होने वाले रूट के लिए उचित डेटा लाने के लिए अलग-अलग एपीआई एंडपॉइंट्स को कॉल करने की आवश्यकता है। मेरे कई घटकों के लिए एक रिज़ॉल्वर होने की बजाय, मैं एक सामान्य संकल्पक बना रहा हूं। इस प्रकार, मैं मार्ग परिभाषा में कस्टम इनपुट पास करना चाहता हूं जो सही एंडपॉइंट को इंगित करता है। उदाहरण के लिए, इन मार्गों पर विचार करें:

app.routes.ts

appRoutes = [ 
    { 
    path: 'project/:id', 
    component: ProjectComponent, 
    resolve: { data: DataResolver } 
    }, 
    { 
    path: 'store/:id', 
    component: StoreComponent, 
    resolve: { data: DataResolver } 
    } 
] 

पहले उदाहरण में रिसोल्वर /path/to/resource1/id कॉल करने के लिए की आवश्यकता होगी। दूसरे मामले में, /path/to/resource2/id। आदर्श रूप से, मैं एंडपॉइंट को रूट परिभाषा में एक तर्क के रूप में पास कर दूंगा जो तब DataResolver कन्स्ट्रक्टर में उपलब्ध होगा।

क्या यह सामान्य जेनरेटर क्लास के साथ किया जा सकता है?

Angular 2.0.1Typescript 2.0.3

उत्तर

10

मैं इसे निर्माता में उपलब्ध कराने के बारे में पता नहीं है में लिखा, डि का उपयोग किए बिना। लेकिन अगर आप यह resolve विधि में उपलब्ध हैं, तो आप सिर्फ एक data संपत्ति मार्ग परिभाषा जोड़ सकता है, और यह यह ActivatedRouteSnapshot

{ 
    path: 'project/:id', 
    component: ProjectComponent, 
    resolve: { data: DataResolver }, 
    data: { path: 'project/:id' } 
} 

class DataResolve implements Resolve<string> { 
    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 
    return route.data['path']; 
    } 
} 
+0

अंतिम पंक्ति में - 'path.data ['path']', 'आईडी' स्वचालित रूप से वर्तमान रूट पैरामीटर के साथ बदल दिया जाएगा या यह शाब्दिक स्ट्रिंग 'प्रोजेक्ट/आईडी आईडी होगा? – BeetleJuice

+1

नहीं। मुझे लगता है कि मैंने आपके प्रश्न को गलत समझा। हालांकि मैं यही चाहता था। बस 'मार्ग' से 'यूआरएल' प्राप्त करें। यह एक 'UrlSegment [] 'होगा। 'url [1] .path' में आईडी होना चाहिए, और' url [0] .path' 'project' –

+0

होना चाहिए, मैं समझाने के लिए एक बेहतर काम कर सकता था। 'हल() 'एपीआई को कॉल करेगा और पर्यवेक्षक को वापस करेगा जो सर्वर द्वारा लौटाए गए डेटा को उत्सर्जित करेगा। मेरी चुनौती यह थी कि कॉल करने के लिए एपीआई एंडपॉइंट उस घटक पर निर्भर करता है जिसका डेटा हल हो रहा है। आपका जवाब हालांकि उपयोगी है। मैं 'संकल्प() 'पर कस्टम इनपुट उपलब्ध कराने के लिए मार्ग की' डेटा' प्रॉपर्टी का उपयोग कर सकता हूं। धन्यवाद। – BeetleJuice

0

इस उत्तर मेरी समस्या हल करने के लिए उपलब्ध हो जाएगा, लेकिन मैं भी इस की जरूरत मार्ग में कई रिज़ॉल्यूशन होने पर लागू किया जाना चाहिए।

उदाहरण के लिए।

{ 
    path: 'transactions/showcase/edit/:id', 
    component: ClientsTransactionsFormComponent, 
    resolve: { 
     clients: Resolver, 
     clientTransaction: Resolver, 
     clientTransactionTypes: Resolver 
    }, 

उस स्थिति में मैंने डेटा में एक सरणी पारित करके मेरी समस्या हल की।

data: ['Clients/GetAll', 'ClientTransactions/GetByID/', 'ClientTransactionTypes/GetAll'] 

है और यह भी इस तरह मेरी समाधानकर्ता संशोधित ..

resolve(route: ActivatedRouteSnapshot) { 
    let row = []; 
    let id = ""; 

    Object.keys(route.data).forEach(e => { 
     row.push(route.data[e]); 
    }) 

    let path: string = row[0]; 
    delete row[0]; 

    route.data = row; 

    if (path.lastIndexOf('/') == path.length - 1) { 
     id = route.params['id']; 
    } 

    return this._httpService.httpGet(this.baseUrl + path + id); 
    } 

आशा है कि यह किसी को भी मदद करता है।

संबंधित मुद्दे