2017-05-18 14 views
11

मेरे पास एक ऐसी स्थिति है जहां मैं किसी घटक को नेविगेट करने से पहले एक HTTP कॉल के माध्यम से रिमोट स्रोत से कुछ डेटा प्री-लोड करने के लिए हल का उपयोग कर रहा हूं। अब मुझे कुछ गार्ड तर्क लागू करने की आवश्यकता है, जिसके लिए कुछ स्थितियों के आधार पर, उस डेटा को वर्तमान उपयोगकर्ता के खिलाफ कुछ फ़ील्ड सत्यापित करने के लिए पूर्व-लोड किया जाना चाहिए।Canularctate गार्ड से कोणीय 2 पास डेटा को हल करने के लिए हल करें?

मैं CanActivate गार्ड में बैकएंड के लिए वही अनुरोध करने से बचाना चाहता हूं और उसके तुरंत बाद Resolve में।

वहाँ किसी तरह मैं CanActivate या मार्ग config अंदर से मार्ग डेटा तक पहुँच सकते अस्थायी रूप से समाधानकर्ता ओवरराइड करने के लिए और सिर्फ डेटा वस्तु पर मान सेट के बाद से मुझे मिल गया है कि मैं क्या के बारे में अनुरोध करने के लिए कर रहा हूँ है?

मैं के रूप में

route.data['myData'] = value; 

के रूप में सरल कुछ के साथ दूर हो रही लेकिन क्योंकि "वस्तु एक्स्टेंसिबल नहीं है" यह एक त्रुटि है की कोशिश की।

this.router.routerState.root.data['myData'] = value; 

कौन सा किसी भी त्रुटि का निर्माण नहीं किया, फिर भी डेटा Resolve.resolve() विधि के route.data तत्व में बचा रह गया नहीं था:

मैं भी कुछ ऐसा करने की कोशिश की।

मैं कुछ कस्टम या हैकी से बचाना चाहता हूं जैसे किसी अस्थायी रूप से सेवा पर ऑब्जेक्ट को अस्थायी रूप से संग्रहीत करना। उन्नत प्री-फ़ेचिंग और डेटा स्वामित्व जांच जैसी सामग्री का समर्थन करने के लिए आंतरिक राउटर तत्वों के बीच डेटा स्थानांतरित करने के लिए कोई मानक तंत्र है? यदि आप Resolve वर्ग के निर्माता में रूटर, और यह उसी तरह का उपयोग इंजेक्षन

संपादित routerState काम करता है। लेकिन इसे बाद में साफ़ करने की जरूरत है अन्यथा यह नेविगेशन कॉल के बीच जारी रहता है।

object is not extensible

लेकिन आप पूरी वस्तु की जगह ले सकता, इस तरह:

@Injectable() 
export class MyGuard implements CanActivate { 
    canActivate(
    next: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean { 

    // Use the spread operator to keep the previously resolved data 
    next.data = {...next.data, guardedData: 'guarded'}; 
    return true; 
    } 
} 

और पहुँच

उत्तर

0

संपत्ति एक ActivatedRouteSnapshot की data अपरिवर्तनीय है, इस कारण तुम क्यों त्रुटि प्राप्त है यह आपके रिज़ॉल्वर

@Injectable() 
export class FooResolver implements Resolve<any> { 

    resolve(
    route: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot 
): Observable<any>|Promise<any>|any { 
    return route.data.guardedData; 
    } 

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