कोणीय 2 राउटर के साथ वर्तमान मार्ग को कैसे पुनः लोड करें


141

मैं हैशलोकेशन रणनीति के साथ कोणीय 2 का उपयोग कर रहा हूं।

घटक उस मार्ग से भरा हुआ है:

"departments/:id/employees"

अब तक ठीक है।

मैं एक संपादित बैच पंक्तियों की एक सफल बैच सेविंग करने के बाद वर्तमान रूट यूआरएल को फिर से लोड करना चाहता हूं:

this.router.navigate([`departments/${this.id}/employees`]);

लेकिन ऐसा कुछ नहीं होता, क्यों?


इसी तरह के एक प्रश्न के उत्तर पर एक नज़र डालें: stackoverflow.com/a/44580036/550975
सर्ज

जवाबों:


46

यदि आपका नेविगेट () आपके ब्राउज़र के एड्रेस बार पर पहले से दिखाए गए URL को नहीं बदलता है, तो राउटर को कुछ नहीं करना है। डेटा को रिफ्रेश करना राउटर का काम नहीं है। यदि आप डेटा को ताज़ा करना चाहते हैं, तो घटक में इंजेक्ट की जाने वाली सेवा बनाएं और सेवा पर लोड फ़ंक्शन को लागू करें। यदि नया डेटा पुनर्प्राप्त किया जाएगा, तो यह बाइंडिंग के माध्यम से दृश्य को अपडेट करेगा।


2
अब आप यह कहते हैं कि मैं सहमत होना होगा, लेकिन ... AngularJS ui रूटर था एक रीलोड इस प्रकार एक मार्ग पुन: लोड विकल्प opiniated है ;-) लेकिन हाँ मैं सिर्फ इतना है कि टिप जो वास्तव में स्पष्ट है ... के लिए एक फिर से लोड डेटा THX कर सकता है
पास्कल

83
मैं इस बात से सहमत नहीं हूं कि अगर आप गार्ड को फिर से दौड़ाना चाहते हैं, तो कहेंगे कि क्या कोई बाहर जाता है?
जैकी

1
@ जैकी मैं सोच रहा था कि शायद आप गार्ड को फिर से दौड़ सकते हैं ... अगर वे पुनर्निर्देशित किए गए हैं, तो वह चाल हो सकती है।
OldTimeGuitarGuy

11
@YakovFain क्षमा करें, लेकिन यह गलत है। इसका मतलब है कि अब आपके पास मार्ग व्यवहार के लिए सत्य के दो स्रोत हैं - एक गार्ड के दौरान होता है, दूसरा घटक में होता है। न केवल आप अब संभावित रूप से तर्क को दोहरा रहे हैं, आप एक अधिक प्राकृतिक डेटा प्रवाह के खिलाफ बढ़ रहे हैं: 1. एपीआई में बदलाव करें, 2. एपीआई से डेटा की नई स्थिति लाने के लिए मार्ग को ताज़ा करें, जिससे एपीआई सच्चाई का स्रोत बन जाए। उपयोगकर्ताओं को मैन्युअल रूप से एक मार्ग को फिर से ट्रिगर करने की क्षमता देने के लिए बस कारण नहीं है, ताकि डेटा का प्राकृतिक प्रवाह फिर से हो सके।
अगमलाउनर

4
मुझे नहीं लगता कि यह एक अच्छा जवाब है। राउटर आपके डेटा के लिए सत्य का स्रोत होना चाहिए। यदि आपको इसे एक अलग सेवा के माध्यम से फिर से लोड करना है, तो राउटर को नवीनतम संस्करण के बारे में पता नहीं है और आपके घटक अब सत्य के स्रोत के रूप में आपके राउटर पर भरोसा नहीं कर सकते हैं।
डैन किंग

124

यह अब onSameUrlNavigationराउटर कॉन्फ़िगरेशन की संपत्ति का उपयोग करके कोणीय 5.1 में किया जा सकता है ।

मैंने यह बताते हुए एक ब्लॉग जोड़ा है कि यहाँ कैसे लेकिन इसका सार इस प्रकार है

https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2

अपने राउटर कॉन्फिग को इनेबल onSameUrlNavigationऑप्शन पर सेट करें 'reload'। जब आप पहले से सक्रिय एक मार्ग पर नेविगेट करने का प्रयास करते हैं, तो यह राउटर एक घटना चक्र को आग लगाने का कारण बनता है।

@ngModule({
 imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: 'reload'})],
 exports: [RouterModule],
 })

अपने रूट परिभाषाओं में, पर सेट runGuardsAndResolversकरें always। यह राउटर को हमेशा गार्ड्स और रिसॉल्वर साइकल को किक करने, संबद्ध घटनाओं को फायर करने के लिए बताएगा।

export const routes: Routes = [
 {
   path: 'invites',
   component: InviteComponent,
   children: [
     {
       path: '',
       loadChildren: './pages/invites/invites.module#InvitesModule',
     },
   ],
   canActivate: [AuthenticationGuard],
   runGuardsAndResolvers: 'always',
 }
]

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

export class InviteComponent implements OnInit, OnDestroy {
 navigationSubscription;     

 constructor(
   // … your declarations here
   private router: Router,
 ) {
   // subscribe to the router events. Store the subscription so we can
   // unsubscribe later.
   this.navigationSubscription = this.router.events.subscribe((e: any) => {
     // If it is a NavigationEnd event re-initalise the component
     if (e instanceof NavigationEnd) {
       this.initialiseInvites();
     }
   });
 }

 initialiseInvites() {
   // Set default values and re-fetch any data you need.
 }

 ngOnDestroy() {
   if (this.navigationSubscription) {
     this.navigationSubscription.unsubscribe();
   }
 }
}

इन सभी चरणों के साथ, आपके पास रूट पुनः लोडिंग सक्षम होना चाहिए।


क्या किसी initफ़ंक्शन को कॉल करने के बजाय घटक को फिर से लोड करने का एक तरीका है ,
Ebraheem Alrabeea

मुझे ऐसा नहीं लगता ... जब तक आप मार्ग से दूर नहीं जाते और फिर से वापस नहीं आते। एक init फ़ंक्शन दुनिया का अंत नहीं है, आप इस बिंदु पर आरंभीकरण को नियंत्रित कर सकते हैं कि इसका घटक को फिर से लोड करने के समान प्रभाव है। क्या कोई विशेष कारण है जिसके बिना आप एक पूर्ण पुनः लोड करना चाहते हैं init?
साइमन मैकक्लेव

मुझे अपनी समस्या का हल मिल गया है, आपकी प्रतिक्रिया और ब्लॉग के लिए धन्यवाद।
इब्राहीम अलाराबेए

इसे विंडो रीलोड के अलावा कोणीय 4 में कैसे करें।
विशाखा

मेरे Angular5 ऐप के लिए बढ़िया काम करता है! NgOnDestroy () में सदस्यता समाप्त करना महत्वपूर्ण है - दिलचस्प है जब आप ऐसा नहीं करते हैं :-)
BobC

107

कंट्रोलर में एक फंक्शन बनाएं जो अपेक्षित रूट को रीडायरेक्ट करता है जैसे

redirectTo(uri:string){
   this.router.navigateByUrl('/', {skipLocationChange: true}).then(()=>
   this.router.navigate([uri]));
}

तो इसे इस तरह का उपयोग करें

this.redirectTo('//place your uri here');

यह फ़ंक्शन एक डमी मार्ग पर रीडायरेक्ट करेगा और उपयोगकर्ता को इसे साकार किए बिना जल्दी से गंतव्य मार्ग पर लौट आएगा।


3
धन्यवाद! सबसे अच्छा समाधान यहाँ।
एलन स्मिथ

यह समाधान ठीक काम करता है, हम इसका उपयोग तब तक कर सकते हैं जब तक हम एक बेहतर नहीं हो जाते। धन्यवाद @
सिबेश वेणु

12
यह एक आकर्षण की तरह काम करता है जब मैं '/''/DummyComponent'
suhailvs

1
ब्राउज़र इतिहास में समस्याओं के बिना, कोणीय 7 में ठीक काम करता है। मैंने एक विशिष्ट घटक को लक्षित होने के कारण इस समाधान का उपयोग करने का विकल्प चुना। यह मुझे लगता है कि एक ही पृष्ठ को फिर से लोड करना आम तौर पर एक असामान्य मामला है, इसलिए पूरे आवेदन को एक विशिष्ट प्रतिमान का पालन करना ओवरकिल जैसा लगता है। यह अन्य समाधानों की तुलना में छोटा और आसान है।
जेई कार्टर II

1
ठीक है, लेकिन यह काम करता है ... यह आपके HomeComponent को पुनः लोड करेगा (या आपके पास "/" मार्ग पर जो भी है), कुछ भी नहीं के लिए ngOnInit / ngOnDestroy के पूर्ण जीवनचक्र को पार कर जाएगा। कुछ डमी और हल्के घटक के साथ एक विशिष्ट मार्ग रखने के लिए बेहतर है या आप अंतराल पर ध्यान देंगे
पेट्रोनिअस

77

संपादित करें

Angular (5.1+) के नए संस्करणों के लिए @Simon McClive द्वारा सुझाए गए उत्तर का उपयोग करें

पुराना उत्तर

मुझे यह वृत्तान्त GitHub फ़ीचर अनुरोध पर कोणीय के लिए मिला

this._router.routeReuseStrategy.shouldReuseRoute = function(){
    return false;
};

this._router.events.subscribe((evt) => {
    if (evt instanceof NavigationEnd) {
        this._router.navigated = false;
        window.scrollTo(0, 0);
    }
});

मैंने इसे अपने app.component.ts ngOnInit फ़ंक्शन में जोड़ने की कोशिश की , और यह सुनिश्चित हो गया कि काम किया है। उसी लिंक पर अब आगे सभी क्लिक componentडेटा और डेटा को पुनः लोड करते हैं ।

मूल GitHub सुविधा अनुरोध से लिंक करें

क्रेडिट GitHub पर mihaicux2 को जाता है।

मैंने इसके 4.0.0-rc.3साथ संस्करण पर परीक्षण कियाimport { Router, NavigationEnd } from '@angular/router';


1
बस Angular 4.4.x में यह कोशिश की और यह पूरी तरह से काम करता है। धन्यवाद!
मिनट्स टीम

1
यह मेरे लिए बहुत अच्छा काम कर रहा था, जब तक कि मैंने अपने ऐप में प्रत्येक मूल मार्ग के बच्चों के मार्गों के माध्यम से नेविगेट करने के लिए मटीरियल के ने-टैब-बार को लागू नहीं किया। एक बार जब उपयोगकर्ता इस कोड को चलाने वाले पेज को हिट करता है, तो एनिमेटेड इंक बार गायब हो जाएगा। (क्यों? मेरे पास समझाने के लिए पर्याप्त समय या स्थान नहीं है ...)
andreisrob

3
यह एक बहुत बुरा विचार है - अब आपका ActivatedRoute हमेशा एक जैसा रहेगा।
आर्टुस्का

1
यदि आप Angular 5.1+ पर हैं, तो @AnandTyagi साइमनमेकिव समाधान का प्रयास करें। हो सकता है कि यह आपके लिए बेहतर काम करे।
अर्ग0n

2
बहुत बुरा विचार ... क्योंकि एक बार जब इसने आवेदन किया rReuseStrategy.shouldReuseRoute = false, तो यह घटक पदानुक्रम के प्रत्येक घटक को लोड करेगा। तो इसका मतलब है कि आपका हर माता-पिता और बच्चा घटक किसी भी url परिवर्तनों पर पुनः लोड करना शुरू कर देता है। तो फिर इस ढांचे का उपयोग करने का कोई अर्थ नहीं है।
PSabuwala

27

थोड़ा मुश्किल: कुछ डमी पारम के साथ एक ही पथ का उपयोग करें। उदाहरण के लिए-

refresh(){
  this.router.navigate(["/same/route/path?refresh=1"]);
}

12
अब: this.router.navigate(['/pocetna'], { queryParams: { 'refresh': 1 } });और route.queryParams.subscribe(val => myRefreshMethod())जहां route: ActivatedRouteताज़ा घटक में इंजेक्शन लगाया गया है ... आशा है कि यह मदद करता है
insan-e

4
वर्तमान में कोणीय 7 में यह किसी भी अधिक काम नहीं करता है। क्या कोई पुष्टि कर सकता है, या मैं कुछ गलत कर रहा हूं? (मैंने इन्सान-ए की थोड़ी भिन्नता भी
आजमाई

2
थोड़ा बदसूरत शायद।
डब्बब।

19

मैं यह एक कोणीय 9 परियोजना के लिए उपयोग कर रहा हूं:

reloadCurrentRoute() {
    let currentUrl = this.router.url;
    this.router.navigateByUrl('/', {skipLocationChange: true}).then(() => {
        this.router.navigate([currentUrl]);
    });
}

पुनश्च: परीक्षण और "कोणीय 7, 8" पर भी काम करता है


मैंने सोचा कि मैं इस समाधान के साथ अपने अनुभव पर झंकार करूँगा। मेरे लिए, यह मार्ग से जुड़े पूरे घटक को पुनः लोड करने के लिए लगता है। मेरी स्थिति में एक नियमित राउटर। अलग-अलग राउटिंग पैरामेट्स के साथ उपयोग करें, कंपोनेंट को लोड रखेंगे और सिर्फ ngOnInit (रूट परमेस पर आधारित) से नए बदलाव लोड करेंगे। आपका समाधान ऐसा करने के लिए प्रतीत नहीं होता है, ऐसा लगता है कि यह वास्तव में पूरे घटक को फिर से लोड करता है और फिर इसे एनजीऑनिट में बदलाव करता है, जो कि पूर्ण डेटा पर आधारित है। किसी भी तरह, यह मेरी स्थिति में मेरे लिए एक छोटी सी असुविधा है और आपका समाधान मेरी जरूरतों के लिए काम करता है।
इवान सेवी

धन्यवाद। अच्छी तरह से काम।
संतोष

17

कोणीय 2-4 मार्ग पुनः लोड हैक

मेरे लिए, मूल विधि (घटक, जो किसी भी मार्ग पर मौजूद है) के अंदर इस विधि का उपयोग करना काम करता है:

onRefresh() {
  this.router.routeReuseStrategy.shouldReuseRoute = function(){return false;};

  let currentUrl = this.router.url + '?';

  this.router.navigateByUrl(currentUrl)
    .then(() => {
      this.router.navigated = false;
      this.router.navigate([this.router.url]);
    });
  }

इस दृष्टिकोण के साथ सावधान रहें, यह विश्व स्तर पर राउटर व्यवहार को प्रभावित करेगा (बाल मार्गों के बीच नेविगेट करते समय मूल मार्ग हमेशा लोड होगा)।
सीडमे

16

यह मेरे लिए एक आकर्षण की तरह काम करता है

this.router.navigateByUrl('/', {skipLocationChange: true}).then(()=>
this.router.navigate([<route>]));

3
यह सबसे सरल उत्तर है। यदि मैं कर सकता हूं तो मैं इसे स्वीकृत उत्तर के रूप में चिह्नित करूंगा। स्वीकृत उत्तर के विपरीत, ऐसी परिस्थितियाँ हो सकती हैं जहाँ आपको एक पृष्ठ पर उपयोग किए जाने वाले प्रत्येक घटक को पुनः लोड करने की आवश्यकता होती है और व्यक्तिगत रूप से प्रत्येक को पुनः लोड करना पड़ता है, जो विभिन्न मार्गों पर हो सकता है, एक सेवा के माध्यम से भी ओवरकिल होगा।
एंड्रयू जूनियर हावर्ड

8

परम परिवर्तन पुनः लोड पृष्ठ पर नहीं होगा। यह वास्तव में अच्छी सुविधा है। पृष्ठ को फिर से लोड करने की आवश्यकता नहीं है लेकिन हमें घटक के मूल्य को बदलना चाहिए। paramChange विधि url परिवर्तन पर कॉल करेगी। तो हम घटक डेटा को अपडेट कर सकते हैं

/product/: id / details

import { ActivatedRoute, Params, Router } from ‘@angular/router’;

export class ProductDetailsComponent implements OnInit {

constructor(private route: ActivatedRoute, private router: Router) {
    this.route.params.subscribe(params => {
        this.paramsChange(params.id);
    });
}

// Call this method on page change

ngOnInit() {

}

// Call this method on change of the param
paramsChange(id) {

}

8

यही मैंने एंगुलर 9 के साथ किया । मुझे यकीन नहीं है कि पुराने संस्करणों में यह काम करता है।

जब आपको पुनः लोड करने की आवश्यकता हो तो आपको इसे कॉल करना होगा।

 this.router.navigate([], {
    skipLocationChange: true,
    queryParamsHandling: 'merge' //== if you need to keep queryParams
  })

राउटर फॉररूट को 'पुनः लोड' करने के लिए समान उपयोगिता सेट करने की आवश्यकता है

 RouterModule.forRoot(appRoutes, {
  // ..
  onSameUrlNavigation: 'reload',
  // ..
})

और आपके हर मार्ग को 'हमेशा' चलाने के लिए रनगार्डएंडएंडोल्वर्स सेट करना होगा।

{
    path: '',
    data: {},
    runGuardsAndResolvers: 'always'
},

1
यह सही जवाब है। "onSameUrlNavigation" कोणीय 5 के बाद से काम करता है। कृपया इसे शीर्ष पर ले जाने के लिए upvote करें
यारोस्लाव

यह मेरे लिए काम नहीं किया। एंडिस के नीचे किया। हालांकि एंडिस का पुनः लोड करना वास्तविक नियमित मार्ग नेविगेशन के रूप में 'साफ' नहीं है। यह पूरे पृष्ठ को पुनः लोड करने के लिए प्रतीत नहीं होता है, लेकिन यह मार्ग से जुड़े पूरे घटक को फिर से लोड करता है। मुझे रूट मापदंडों के आधार पर पुनः लोड करने के लिए बच्चे के घटकों की आवश्यकता थी, न कि मार्ग से जुड़े पूरे घटक की। किसी भी तरह, यह काफी अच्छी तरह से काम करता है। बस मैंने सोचा कि मैं अपने अनुभव पर झंकार करूँगा।
इवान सेवी

4

मेरे लिए कड़ी मेहनत के साथ काम करता है

this.router.routeReuseStrategy.shouldReuseRoute = function() {
    return false;
    // or
    return true;
};

1
सिफारिश नहीं की गई! लोग इस समाधान को इस SO के दौरान अलग-अलग तरीकों से पुनः पोस्ट करते रहते हैं। हाँ यह आपके तात्कालिक मुद्दे को ठीक कर सकता है लेकिन आप बाद में यह भूल जाते हैं कि आपने इसे लागू किया है और आप यह जानने में घंटों बिता रहे हैं कि आपका ऐप अजीब व्यवहार क्यों कर रहा है।
हेलजेट 13

यदि आपको इस उपयोग को Ebraheem Alrabee 'समाधान का उपयोग करना चाहिए और केवल इसे एक ही मार्ग पर लागू करना चाहिए।
हेलजेट 14

4

जहां तक ​​मुझे पता है कि यह कोणीय 2 में राउटर के साथ नहीं किया जा सकता है। लेकिन आप बस कर सकते हैं:

window.location.href = window.location.href

दृश्य पुनः लोड करने के लिए।


3
यह सिर्फ वर्तमान मार्ग ही नहीं पूरे आवेदन को ताज़ा करता है!
रोस्टामाइनी

@ हेलोवर्ल्ड - कोणीय 7 में इस प्रकार तर्क कहाँ रखें?
प्र। ए।

इससे कोई फर्क नहीं पड़ता है कि कौन सा कोणीय संस्करण है - यह सिर्फ नियमित जेएस कोड है
हैलो वर्ल्ड

इसे क्लिक फ़ंक्शन पर रखें। window.location.href = '/' या '/ लॉगिन' जो कभी ऐप-राउटिंग.module.ts के अंदर परिभाषित करता है। मेरे मामले में जब उपयोगकर्ता लॉगआउट करता है तो उसे लॉगिन स्क्रीन पर वापस जाना चाहिए ताकि लॉगआउट पर मैं सभी डेटा को साफ़ कर दूं और सफलता के लिए window.location.href = '/' का उपयोग करें। इसका अर्थ है लोडिन पेज को फिर से लोड करना और सभी जावास्क्रिप्ट को फिर से लोड करना। मार्ग के सामान्य परिवर्तन के लिए मैं इसकी अनुशंसा नहीं करूँगा जहाँ कार्यों की कोई पुनरावृत्ति की आवश्यकता नहीं है।
अली एक्सलेटर

मेरा मानना ​​है कि यह आपके NgRx स्टोर को पूरी तरह से रीसेट कर सकता है - इसलिए आपके द्वारा पहले से प्राप्त किया गया कोई भी डेटा खो जाएगा।
जॉन क्यू

3

एक त्वरित और सीधे आगे का समाधान मिला जिसे कोणीय के आंतरिक कामकाज के साथ टिंकर करने की आवश्यकता नहीं है:

मूल रूप से: बस एक ही गंतव्य मॉड्यूल के साथ एक वैकल्पिक मार्ग बनाएं और उनके बीच बस टॉगल करें:

const routes: Routes = [
  {
    path: 'gesuch',
    loadChildren: './sections/gesuch/gesuch.module#GesuchModule'
  },
  {
    path: 'gesuch-neu',
    loadChildren: './sections/gesuch/gesuch.module#GesuchModule'
  }
];

और यहाँ toggeling मेनू:

<ul class="navigation">
    <li routerLink="/gesuch-neu" *ngIf="'gesuch' === getSection()">Gesuch</li>
    <li routerLink="/gesuch" *ngIf="'gesuch' !== getSection()">Gesuch</li>
</ul>

आशा करता हूँ की ये काम करेगा :)


क्या होगा यदि वैकल्पिक मार्ग में पैरामीटर है और पैरामीटर बदलते समय आप फिर से लोड करना चाहते हैं?
मुकुस

3

थोड़ा कट्टर लेकिन

this.router.onSameUrlNavigation = 'reload';
this.router.navigateByUrl(this.router.url).then(() => {

    this.router.onSameUrlNavigation = 'ignore';

});

2

मेरे मामले में:

const navigationExtras: NavigationExtras = {
    queryParams: { 'param': val }
};

this.router.navigate([], navigationExtras);

सही काम करो


2

मार्ग पर लागू करें और कॉल करें ngOnInit () path.navigate () के लिए विधि में

एक उदाहरण देखें:

export class Component implements OnInit {

  constructor() {   }

  refresh() {
    this.router.navigate(['same-route-here']);
    this.ngOnInit();   }

  ngOnInit () {

  }

2

के लिए एक डमी घटक और मार्ग का उपयोग करके एक समान परिदृश्य को हल किया reload, जो वास्तव में ए redirect। यह निश्चित रूप से सभी उपयोगकर्ता परिदृश्यों को कवर नहीं करता है, लेकिन सिर्फ मेरे परिदृश्य के लिए काम करता है।

import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { Http } from '@angular/http';

@Component({
  selector: 'reload',
  template: `
    <h1>Reloading...</h1>
  `,
})
export class ReloadComponent implements OnInit{
  constructor(private router: Router, private route: ActivatedRoute) {
  }

  ngOnInit() {
    const url = this.route.snapshot.pathFromRoot.pop().url.map(u => u.path).join('/');
    this.router.navigateByUrl(url);
  }
}

रूटिंग को वाइल्डकार्ड का उपयोग करके सभी यूआरएल को पकड़ने के लिए वायर्ड किया जाता है:

import { RouterModule } from '@angular/router';
import { NgModule } from '@angular/core';
import { LoginViewComponent } from './views/login/login.component';
import { HomeViewComponent } from './views/home/home.component';
import { ReloadComponent } from './views/reload/reload.component';

@NgModule({
  declarations: [ 
    LoginViewComponent, HomeViewComponent, ReloadComponent
  ],
  imports: [
    RouterModule.forRoot([
      { path: 'login', component: LoginViewComponent },
      { path: 'home', component: HomeViewComponent },
      { 
        path: 'reload',
        children: [{
          path: '**',
          component: ReloadComponent 
        }]
      },
      { path: '**', redirectTo: 'login'}
    ])
  ],
  exports: [
    RouterModule,
  ],
  providers: [],

})
export class AppRoutingModule {}

इसका उपयोग करने के लिए, हमें केवल उस url में पुनः लोड जोड़ना होगा जहां हम जाना चाहते हैं:

  this.router.navigateByUrl('reload/some/route/again/fresh', {skipLocationChange: true})

2

वर्तमान मार्ग को ताज़ा करने के लिए अलग-अलग दृष्टिकोण हैं

राउटर व्यवहार बदलें (चूंकि कोणीय 5.1) राउटर ऑनसमेलनैविगेशन को 'पुनः लोड करें' पर सेट करें। यह एक ही URL नेविगेशन पर राउटर घटनाओं का उत्सर्जन करेगा।

  • फिर आप किसी मार्ग की सदस्यता लेकर उन्हें संभाल सकते हैं
  • आप इसे फिर से शुरू करने के लिए फिर से इस्तेमाल कर सकते हैं

राउटर को अछूता छोड़ दें

  • URL में वर्तमान टाइमस्टैम्प के साथ एक ताज़ा क्वेरीपराम पास करें और अपने रूट किए गए घटक में queryParams की सदस्यता लें।
  • राउटर घटक की पकड़ पाने के लिए राउटर-आउटलेट के सक्रिय इवेंट का उपयोग करें।

मैंने https://medium.com/@kevinkreuzer/refresh-current-route-in-angular-512a19d58f6e के तहत अधिक विस्तृत विवरण लिखा है

उम्मीद है की यह मदद करेगा।


1

मान लें कि जिस घटक का मार्ग आप रिफ्रेश करना चाहते हैं view, उसका उपयोग करें:

this.router.routeReuseStrategy.shouldReuseRoute = function (future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot) {
  if (future.url.toString() === 'view' && curr.url.toString() === future.url.toString()) {
    return false;
  }
  return (future.routeConfig === curr.routeConfig);
}; 

debuggerनेविगेट करने के बाद सटीक मार्ग क्या होगा, यह जानने के लिए आप एक विधि जोड़ सकते हैं "departments/:id/employees"


1

एक समाधान एक डमी पैरामीटर (यानी सेकंड में समय) पास करने के लिए है, इस तरह से लिंक हमेशा पुनः लोड होता है:

this.router.navigate(["/url", {myRealData: RealData, dummyData: (new Date).getTime()}])

1

मै इस्तेमाल कर रहा हूँ setTimeout और navigationByUrlइस समस्या को हल करने के लिए ... और यह मेरे लिए ठीक काम कर रहा है।

इसे अन्य URL पर पुनर्निर्देशित किया गया है और इसके बजाय वर्तमान URL में फिर से आता है ...

 setTimeout(() => {
     this.router.navigateByUrl('/dashboard', {skipLocationChange: false}).then(() =>
           this.router.navigate([route]));
     }, 500)

1

मेरा मानना ​​है कि यह (मूल रूप से) कोणीय 6+ में हल किया गया है; जाँच

लेकिन यह पूरे मार्ग के लिए काम करता है (सभी बच्चों के मार्गों को भी शामिल करता है)

यदि आप किसी एकल घटक को लक्षित करना चाहते हैं, तो यहां बताया गया है: एक ऐसे परिवर्तन का उपयोग करें, जिससे आप जितनी बार चाहें उतनी बार नेविगेट कर सकें।

नेविगेशन के बिंदु पर (वर्ग)

   this.router.navigate(['/route'], {
        queryParams: { 'refresh': Date.now() }
    });

घटक में जिसे आप "ताज़ा / पुनः लोड करना चाहते हैं"

// . . . Component Class Body

  $_route$: Subscription;
  constructor (private _route: ActivatedRoute) {}

  ngOnInit() {
    this.$_route$ = this._route.queryParams.subscribe(params => {
      if (params['refresh']) {
         // Do Something
         // Could be calling this.ngOnInit() PS: I Strongly advise against this
      }

    });
  }

  ngOnDestroy() {
    // Always unsubscribe to prevent memory leak and unexpected behavior
    this.$_route$.unsubscribe();
  }

// . . . End of Component Class Body

1

बहुत निराशा होती है कि कोणीय अभी भी इसके लिए एक अच्छा समाधान शामिल नहीं करता है। मैंने यहाँ एक github मुद्दा उठाया है: https://github.com/angular/angular/issues/31843

इस बीच, यह मेरा काम है। यह ऊपर वर्णित कुछ अन्य समाधानों पर बनाता है, लेकिन मुझे लगता है कि यह थोड़ा अधिक मजबूत है। इसमें राउटर सेवा को " ReloadRouter" में लपेटना शामिल है , जो पुनः लोड कार्यक्षमता का ख्याल रखता है और RELOAD_PLACEHOLDERकोर राउटर कॉन्फ़िगरेशन को भी जोड़ता है । यह अंतरिम नेविगेशन के लिए उपयोग किया जाता है और किसी भी अन्य मार्गों (या गार्ड) को ट्रिगर करने से बचा जाता है।

नोट: केवल ReloadRouterउन मामलों में उपयोग करें जब आप पुनः लोड कार्यक्षमता चाहते हैंRouterअन्यथा सामान्य का उपयोग करें ।

import { Injectable } from '@angular/core';
import { NavigationExtras, Router } from '@angular/router';

@Injectable({
  providedIn: 'root'
})
export class ReloadRouter {
  constructor(public readonly router: Router) {
    router.config.unshift({ path: 'RELOAD_PLACEHOLDER' });
  }

  public navigate(commands: any[], extras?: NavigationExtras): Promise<boolean> {
    return this.router
      .navigateByUrl('/RELOAD_PLACEHOLDER', {skipLocationChange: true})
      .then(() => this.router.navigate(commands, extras));
  }
}

1

आयात Routerऔर ActivatedRouteसे@angular/router

import { ActivatedRoute, Router } from '@angular/router';

इंजेक्षन Routerऔर ActivatedRoute(मामले में आपको URL से कुछ भी चाहिए)

constructor(
    private router: Router,
    private route: ActivatedRoute,
) {}

यदि URL से आवश्यकता हो तो कोई भी पैरामीटर प्राप्त करें।

const appointmentId = this.route.snapshot.paramMap.get('appointmentIdentifier');

किसी डमी या मुख्य url पर नेविगेट करके एक ट्रिक का उपयोग करके वास्तविक url पर घटक को रीफ्रेश किया जाएगा।

this.router.navigateByUrl('/appointments', { skipLocationChange: true }).then(() => {
    this.router.navigate([`appointment/${appointmentId}`])
});

आपके मामले में

const id= this.route.snapshot.paramMap.get('id');
this.router.navigateByUrl('/departments', { skipLocationChange: true }).then(() => {
    this.router.navigate([`departments/${id}/employees`]);
});

यदि आप एक डमी मार्ग का उपयोग करते हैं तो आपको शीर्षक ब्लिंक 'नॉट फाउंड' दिखाई देगा यदि आपने कोई यूआरएल नहीं पाया है तो यह किसी भी यूआरएल से मेल नहीं खाता है।


0

रूट पैरामीटर परिवर्तन की सदस्यता लें

    // parent param listener ie: "/:id"
    this.route.params.subscribe(params => {
        // do something on parent param change
        let parent_id = params['id']; // set slug
    });

    // child param listener ie: "/:id/:id"
    this.route.firstChild.params.subscribe(params => {
        // do something on child param change
        let child_id = params['id'];
    });

0

यदि आप राउटर लिंक के माध्यम से मार्ग बदल रहे हैं तो इसका अनुसरण करें:

  constructor(public routerNavigate: Router){

         this.router.routeReuseStrategy.shouldReuseRoute = function () {
            return false;
          };

          this.router.events.subscribe((evt) => {

            if (evt instanceof NavigationEnd) {

                this.router.navigated = false;
             }
          })
      }

0

आपको RouterModule में "onSameUrlNavigation" संपत्ति का उपयोग करना चाहिए और फिर रूट घटनाओं की सदस्यता लें https://blog.angularindepth.com/refresh-current-route-in-angular-512a19a58f6e


किसी समाधान का लिंक स्वागत योग्य है, लेकिन कृपया सुनिश्चित करें कि आपका उत्तर इसके बिना उपयोगी है: लिंक के चारों ओर संदर्भ जोड़ें ताकि आपके साथी उपयोगकर्ताओं को कुछ पता चले कि यह क्या है और यह क्यों है, तो पृष्ठ के सबसे प्रासंगिक हिस्से को उद्धृत करें ' लक्ष्य पृष्ठ अनुपलब्ध होने की स्थिति में पुनः लिंक करना। एक लिंक से थोड़ा अधिक उत्तर देने वाले उत्तर हटाए जा सकते हैं।
एलेसियो

0

यह तय करता है कि मार्ग को गलत जमा करना चाहिए या नहीं

this.router.routeReuseStrategy.shouldReuseRoute = function () {
    return false;
};

और राउटर के नेविगेट किए गए मान को गलत पर सेट करें, यह दर्शाता है कि यह मार्ग कभी भी रूट नहीं किया गया है

this.mySubscription = this.router.events.subscribe(event => {
    if (event instanceof NavigationEnd) {
        this.router.navigated = false;
    }
});

0

मैंने कुछ सुधारों की कोशिश की है और उनमें से कोई भी काम नहीं करता है। मेरा संस्करण सरल है: क्वेरी पैरामीटर में एक नया अप्रयुक्त पैरामीटर जोड़ें

            if (force) {
                let key = 'time';

                while (key in filter) {
                    key = '_' + key;
                }

                filter[key] = Date.now();
            }

            this.router.navigate(['.', { filter: JSON.stringify(filter) }]);

0

window.location.replace

// मार्ग को घेरने के लिए बैकटिक का उपयोग करें

window.location.replace ( departments/${this.id}/employees)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.