कोणीय में पिछले पृष्ठ का URL कैसे निर्धारित करें?


104

मान लीजिए मैं वर्तमान में उस पृष्ठ पर हूं जिसमें URL है /user/:id। अब इस पृष्ठ से मैं अगले पृष्ठ पर जाता हूं :id/posts

अब क्या कोई रास्ता है, ताकि मैं जांच कर सकूँ कि पिछला URL क्या है, यानी /user/:id

नीचे मेरे मार्ग हैं

export const routes: Routes = [
  { 
    path: 'user/:id', component: UserProfileComponent
  },
  {  
    path: ':id/posts', component: UserPostsComponet 
  }
];

जवाबों:


83

आप रूट परिवर्तन की सदस्यता ले सकते हैं और वर्तमान घटना को संग्रहीत कर सकते हैं ताकि आप इसका उपयोग अगले होने पर कर सकें

previousUrl: string;
constructor(router: Router) {
  router.events
  .pipe(filter(event => event instanceof NavigationEnd))
  .subscribe((event: NavigationEnd) => {
    console.log('prev:', event.url);
    this.previousUrl = event.url;
  });
}

यह भी देखें कि कोणीय में मार्ग परिवर्तन का पता कैसे लगाएं?


12
धन्यवाद @ गुंटर आप हमेशा मेरा दिन बचाते हैं।
चंद्र शेखर

34
यह मेरे लिए पिछले मार्ग को सूचीबद्ध नहीं करता है, केवल वर्तमान मार्ग।
डेविड एगुइरे

2
आप क्या उम्मीद करते हैं पर निर्भर करता है। यह पहली बार है nullक्योंकि कोई पिछला मार्ग नहीं है। आपको रूट राउटर पर भी ऐसा करने की आवश्यकता है, अन्यथा आप केवल तभी प्राप्त करेंगे जब आप इस घटक के बाल मार्गों के बीच नेविगेट करेंगे।
गुंटर ज़ोचाउर

8
जब निर्माणकर्ता को पहली बार निष्पादित किया जाता है तो यह पिछले url नहीं देता है।
इकेजित हर्नांडेज़ ट्रॉयस

9
जब पहली बार कंस्ट्रक्टर निष्पादित किया जाता है, तो आप पिछले यूआरएल के रूप में क्या मूल्य की उम्मीद करते हैं?
गुंटर Zöchbauer

114

शायद अन्य सभी उत्तर कोणीय 2.X के लिए हैं।

अब यह कोणीय 5.X के लिए काम नहीं करता है। मैं इसके साथ काम कर रहा हूं।

केवल नेविगेशनएंड के साथ, आप पिछले url नहीं प्राप्त कर सकते हैं।

क्योंकि राउटर "नेवीगेशनस्टार्ट", "रूटसेक्रिटाइज़्ड", ..., से लेकर "नेवीगेशन" तक काम करता है।

आप के साथ जाँच कर सकते हैं

    router.events.forEach((event) => {
  console.log(event);
});

लेकिन फिर भी आपको "नेविगेशनस्टार्ट" के साथ भी पिछले यूआरएल नहीं मिल सकते हैं।

अब आपको जोड़ीदार का उपयोग करने की आवश्यकता है।

import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/pairwise';

constructor(private router: Router) {
  this.router.events
    .filter(e => e instanceof RoutesRecognized)
    .pairwise()
    .subscribe((event: any[]) => {
      console.log(event[0].urlAfterRedirects);
    });
}
    

जोड़ीदार के साथ, आप देख सकते हैं कि url क्या और किस से है।

"RoutesRecognized" मूल से लक्ष्य यूआरएल के लिए बदलते कदम है।

इसलिए इसे फ़िल्टर करें और इससे पिछले url प्राप्त करें।

अंतिम पर कम नहीं,

इस कोड को मूल घटक या उच्च (उदा। app.component.ts) में डालें

क्योंकि यह कोड खत्म होने के बाद आग लगाता है।

अद्यतन कोणीय 6+

events.filterत्रुटि देता है क्योंकि फिल्टर घटनाओं का हिस्सा नहीं है, इसलिए करने के लिए कोड बदलने

import { filter, pairwise } from 'rxjs/operators';

this.router.events
.pipe(filter((evt: any) => evt instanceof RoutesRecognized), pairwise())
.subscribe((events: RoutesRecognized[]) => {
  console.log('previous url', events[0].urlAfterRedirects);
  console.log('current url', events[1].urlAfterRedirects);
});

2
एक सेवा के रूप में लागू किया गया है और यह बहुत अच्छा काम करता है। मैं कोणीय 6.1.7 का उपयोग कर रहा हूं।
ए एल इद्रिसि

5
@ tjvg1991 रीफ़्रेश करने वाले पृष्ठ का अर्थ है कि आपने मेमोरी डेटा खो दिया है। यदि आप पिछला डेटा रखते हैं, तो आपको लोकलस्टोरेज या कुकी का उपयोग करने की आवश्यकता है। (अपने स्थानीय मेमोरी में डेटा नहीं
बचाएं

@BYUNGJUJIN इसके लिए धन्यवाद!
जॉन

1
@BYUNGJUIN subscribe()किसी फ़ील्ड में रिटर्न वैल्यू को स्टोर करता है और unsubscribe()उस पर कॉल करता है ngOnDestroy()। सीवर होना चाहिए। SO पर यहां सदस्यता समाप्त करने के बारे में उदाहरणों के साथ प्रश्न।
गुंटर ज़ोचबॉयर

1
@app कृपया इसे अनसब्सक्राइब करने के लिए देखें: malcontentboffin.com/2017/12/…
BYUNGJU JIN

51

एक इंजेक्शन सेवा बनाएँ:

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

 /** A router wrapper, adding extra functions. */
@Injectable()
export class RouterExtService {

  private previousUrl: string = undefined;
  private currentUrl: string = undefined;

  constructor(private router : Router) {
    this.currentUrl = this.router.url;
    router.events.subscribe(event => {
      if (event instanceof NavigationEnd) {        
        this.previousUrl = this.currentUrl;
        this.currentUrl = event.url;
      };
    });
  }

  public getPreviousUrl(){
    return this.previousUrl;
  }    
}

फिर इसे हर जगह आपकी ज़रूरत के लिए इस्तेमाल करें। जितनी जल्दी हो सके वर्तमान चर को स्टोर करने के लिए, AppModule में सेवा का उपयोग करना आवश्यक है।

// AppModule
export class AppModule {
  constructor(private routerExtService: RouterExtService){}

  //...

}

// Using in SomeComponent
export class SomeComponent implements OnInit {

  constructor(private routerExtService: RouterExtService, private location: Location) { } 

  public back(): void {
    this.location.back();
  }

  //Strange name, but it makes sense. Behind the scenes, we are pushing to history the previous url
  public goToPrevious(): void {
    let previous = this.routerExtService.getPreviousUrl();

    if(previous)
      this.routerExtService.router.navigateByUrl(previous);
  }

  //...

}

2
मुझे लगता है कि यह सबसे सुंदर समाधान है। इस कोड को नए फ़िल्टर और जोड़ीदार समाधान के साथ मिलाने का प्रयास करें: stackoverflow.com/a/35287471/518879
dang89

2
Ps। इस RouterExtService को apps-routing.module.ts (मेरे मामले में) में जोड़ना न भूलें, जैसे:@NgModule({ ..., providers: [RouterExtService]}) export class AppRoutingModule { }
dang89

ठीक है, इस सेवा समाधान के साथ एक बड़ी समस्या है .. मेरे मामले में मैं routerExtService.getPreviousUrl()एक घटक में प्रयुक्त सेवा के निर्माता में विधि को कॉल करता हूं । किसी कारण से इसे वास्तविक अपडेट से पहले कहा जाता है। मतलब हमारे पास टाइमिंग निर्भरता है! मुझे लगता है कि Subject का उपयोग करना बहुत आसान है।
खतरे '

खैर, इसने मेरे लिए एक छोटे से प्रोजेक्ट में काम किया। हो सकता है कि इसे आपकी आवश्यकताओं के अनुरूप कुछ ट्वीक की आवश्यकता हो। क्या आपने समस्या हल कर ली है?
जूलियानो

मैं वर्तमान में तथाकथित URL मैट्रिक्स मापदंडों का उपयोग अपने URL में अपने राज्य को 'स्टोर' करने के लिए कर रहा हूं , डिफ़ॉल्ट रूप से बैक बटन का उपयोग करते समय ब्राउज़र URL राज्य को संग्रहीत करता है। let params = new HttpParams({fromString: retrieveURL}).set('name', 'victor') const paramsObject = params.keys().reduce((obj, key) => { obj[key] = params.get(key) return obj }, {}) this.router.navigate([paramsObject], { relativeTo: this.route })
खतरे '

20

पिछले 6 यूआरएल को स्ट्रिंग के रूप में प्राप्त करने के लिए कोणीय 6 अपडेटेड कोड।

import { Router, RoutesRecognized } from '@angular/router';
import { filter, pairwise } from 'rxjs/operators';


export class AppComponent implements OnInit {

    constructor (
        public router: Router
    ) {
    }

    ngOnInit() {
        this.router.events
            .pipe(filter((e: any) => e instanceof RoutesRecognized),
                pairwise()
            ).subscribe((e: any) => {
                console.log(e[0].urlAfterRedirects); // previous url
            });
    }

यह वह url लौटाता है जिसे एक गार्ड द्वारा ब्लॉक किया गया है, क्या केवल पिछले url को सक्रिय करने का एक तरीका है जो (गार्ड द्वारा अवरुद्ध नहीं) है?
निर्गमन

1
राउटर से अवलोकन के लिए सबसे अच्छा तरीका है के बारे में कोई संकेत?
j4v1

काम करता है! मैं वास्तव में नहीं जानता कि "नेवीगेशन" क्यों काम नहीं करता है
davidwillianx

13

इसने मेरे लिए कोणीय> = 6.x संस्करणों में काम किया:

this.router.events
            .subscribe((event) => {
              if (event instanceof NavigationStart) {
                window.localStorage.setItem('previousUrl', this.router.url);
              }
            });

11

मैं एंगुलर 8 का उपयोग कर रहा हूं और @ फ्रैंकलिन-पीशियस का जवाब समस्या को हल करता है। मेरे मामले में, सदस्यता के अंदर पिछला url प्राप्त करें यदि यह दृश्य में कुछ डेटा के साथ जुड़ा हुआ है, तो कुछ दुष्प्रभाव हो सकते हैं।

मेरे द्वारा उपयोग किया जाने वाला वर्कअराउंड रूट नेविगेशन में एक वैकल्पिक पैरामीटर के रूप में पिछले यूआरएल को भेजने के लिए था।

this.router.navigate(['/my-previous-route', {previousUrl: 'my-current-route'}])

और घटक में इस मान को प्राप्त करने के लिए:

this.route.snapshot.paramMap.get('previousUrl')

this.router और this.route प्रत्येक घटक के निर्माता के अंदर इंजेक्ट किए जाते हैं और @ कोणीय / राउटर सदस्यों के रूप में आयात किए जाते हैं।

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

10

2019 संस्करण में कोणीय 8 और rxjs 6

मैं दूसरों के महान समाधानों के आधार पर समाधान साझा करना चाहूंगा।

पहले मार्गों में परिवर्तन के लिए सुनने के लिए एक सेवा बनाएं और पिछले पिछले मार्ग को एक व्यवहार विषय में सहेजें, फिर इस एप्लिकेशन को मुख्य एप्लिकेशन में प्रदान करें। निर्माणकर्ता में इस सेवा का उपयोग तब करें जब आप चाहते हैं कि पिछले मार्ग को प्राप्त करें।

उपयोग का मामला: आप उपयोगकर्ता को एक विज्ञापन पृष्ठ पर पुनर्निर्देशित करना चाहते हैं, फिर ऑटो उसे पुनर्निर्देशित करता है, जहां से वह आया था इसलिए आपको ऐसा करने के लिए अंतिम पिछले मार्ग की आवश्यकता है।

// service : route-events.service.ts

import { Injectable } from '@angular/core';
import { Router, RoutesRecognized } from '@angular/router';
import { BehaviorSubject } from 'rxjs';
import { filter, pairwise } from 'rxjs/operators';
import { Location } from '@angular/common';

@Injectable()
export class RouteEventsService {

    // save the previous route
  public previousRoutePath = new BehaviorSubject<string>('');

  constructor(
    private router: Router,
    private location: Location
  ) {

    // ..initial prvious route will be the current path for now
    this.previousRoutePath.next(this.location.path());


    // on every route change take the two events of two routes changed(using pairwise)
    // and save the old one in a behavious subject to access it in another component
    // we can use if another component like intro-advertise need the previous route
    // because he need to redirect the user to where he did came from.
    this.router.events.pipe(
      filter(e => e instanceof RoutesRecognized),
      pairwise(),
        )
    .subscribe((event: any[]) => {
        this.previousRoutePath.next(event[0].urlAfterRedirects);
    });

  }
}

app.module में सेवा प्रदान करते हैं

  providers: [
    ....
    RouteEventsService,
    ....
  ]

इसे app.component में इंजेक्ट करें

  constructor(
    private routeEventsService: RouteEventsService
  )

आखिरकार अपने इच्छित घटक में सहेजे गए पिछले मार्ग का उपयोग करें

  onSkipHandler(){
    // navigate the user to where he did came from
    this.router.navigate([this.routeEventsService.previousRoutePath.value]);
  }

यह वास्तव में अच्छी तरह से काम करता है। लेकिन मेरा एक त्वरित प्रश्न है। क्या आप कभी सदस्यता समाप्त करते हैं?
w0ns88

Add take (1) इस तरह -> जोड़ीदार (), take (1))। subscribe ((e: any)
Mukus

1
ध्यान दें कि यदि आप @Injectable({ providedIn: 'root' })सेवा का उपयोग करते हैं तो परियोजना के मूल मॉड्यूल (AppModule) में स्वचालित रूप से लोड हो जाता है और इस प्रकार आपको इसे मैन्युअल रूप से प्रदान नहीं करना पड़ता है app.module। देखें डॉक्स जानकारी के लिए। राउटर ऑब्जर्वबल्स से अनसब्सक्राइब करना आवश्यक नहीं है जैसा कि इस उत्तर में बताया गया है
ऑब्जर्वबल्स

7

ANGULAR 7+ के लिए

दरअसल एंगुलर 7.2 के बाद से पिछले यूआरएल को सेव करने के लिए किसी सर्विस का इस्तेमाल करने की जरूरत नहीं है। आप लॉगिन पृष्ठ से लिंक करने से पहले अंतिम url सेट करने के लिए राज्य ऑब्जेक्ट का उपयोग कर सकते हैं। यहाँ एक लॉगिन परिदृश्य के लिए एक उदाहरण है।

@Component({ ... })
class SomePageComponent {
  constructor(private router: Router) {}

  checkLogin() {
    if (!this.auth.loggedIn()) {
      this.router.navigate(['login'], { state: { redirect: this.router.url } });
    }
  }
}
@Component({...})
class LoginComponent {
  constructor(private router: Router) {}

  backToPreviousPage() {
    const { redirect } = window.history.state;

    this.router.navigateByUrl(redirect || '/homepage');
  }
}
----------------

इसके अतिरिक्त आप टेम्पलेट में डेटा भी पास कर सकते हैं:

@Component({
  template: '<a routerLink="/some-route" [state]="{ redirect: router.url}">Go to some route</a>'
})
class SomePageComponent {
  constructor(public router: Router) {}
}

3

@ GünterZöchbauer भी आप इसे लोकलस्टोरेज में सेव कर सकते हैं लेकिन मैं इसे पसंद नहीं करता) सर्विस में सेव करने के लिए बेहतर है और इस वैल्यू को वहां से प्राप्त करें

 constructor(
        private router: Router
      ) {
        this.router.events
          .subscribe((event) => {
            if (event instanceof NavigationEnd) {
              localStorage.setItem('previousUrl', event.url);
            }
          });
      }

3

आप यहां बताए अनुसार स्थान का उपयोग कर सकते हैं ।

यदि मेरा लिंक नए टैब पर खुलता है तो यहां मेरा कोड है

navBack() {
    let cur_path = this.location.path();
    this.location.back();
    if (cur_path === this.location.path())
     this.router.navigate(['/default-route']);    
  }

आवश्यक आयात

import { Router } from '@angular/router';
import { Location } from '@angular/common';

0

previousNavigationऑब्जेक्ट का उपयोग करके बहुत सरल :

this.router.events
  .pipe(
    filter(e => e instanceof NavigationEnd && this.router.getCurrentNavigation().previousNavigation),
    map(() => this.router.getCurrentNavigation().previousNavigation.finalUrl.toString()),
  )
  .subscribe(previousUrl => {}); 

0

मुझे गार्ड के अंदर पिछले url तक पहुंचने के लिए कुछ संघर्ष करना पड़ा।
कस्टम समाधान लागू किए बिना, यह मेरे लिए काम कर रहा है।

public constructor(private readonly router: Router) {
};

public ngOnInit() {
   this.router.getCurrentNavigation().previousNavigation.initialUrl.toString();
}

प्रारंभिक url पिछला url पेज होगा।


0

इस सरल समाधान ने मेरे लिए काम किया।

import 'rxjs/add/operator/pairwise';
import { Router } from '@angular/router';

export class TempComponent {
    constructor(private router: Router) {
        this.router.events.pairwise().subscribe((event) => {
            console.log(event); // NavigationEnd will have last and current visit url
        });
    };
}

-2

उपरोक्त सभी ANSWER कई बार URL लोड करेंगे। यदि उपयोगकर्ता किसी अन्य घटक पर भी गया है, तो ये कोड लोड होंगे।

सेवा का उपयोग करने के लिए इतना बेहतर है, अवधारणा का निर्माण। https://community.wia.io/d/22-access-the-previous-route-in-your-angular-5-app

यह कोणीय के सभी संस्करणों में अच्छी तरह से काम करेगा। (कृपया अपने app.module फ़ाइल में प्रदाताओं की सरणी में इसे जोड़ना सुनिश्चित करें!)


-2

Rxjx से जोड़ीदार का उपयोग करके आप इस आसान को प्राप्त कर सकते हैं। 'rxjs / ऑपरेटर्स' से {फ़िल्टर, युग्मय} आयात करें;

previousUrl: string;
constructor(router: Router) {
router.events
  .pipe(filter((evt: any) => evt instanceof RoutesRecognized), pairwise())
  .subscribe((events: RoutesRecognized[]) => {
  console.log('previous url', events[0].urlAfterRedirects);
  console.log('current url', events[1].urlAfterRedirects);
  this.previousUrl = events[0].urlAfterRedirects;
});

}


-6

जब मैं पिछले पृष्ठ पर वापस जाना चाहता था तो मुझे ऐसी ही समस्या थी। जितना मैं सोच सकता था उससे ज्यादा आसान समाधान था।

<button [routerLink]="['../']">
   Back
</button>

और यह मूल url पर वापस आ जाता है। मुझे उम्मीद है कि यह किसी की मदद करेगा;)


यह काम नहीं करेगा, आप ओपी द्वारा बताए गए पिछले यूआरएल के बजाय राउटर के रास्ते पर जाने के लिए कह रहे हैं।
फ्रेडरिक यसिड पेना सानचेज़

यदि आपका यूआरएल मापदंडों के साथ जटिल है, या माता-पिता के समान पथ नहीं है तो यह काम नहीं करता है। यह तभी काम करता है जब आप "कुछ / माता-पिता / बच्चे" से वापस "कुछ / माता-पिता" के लिए जाना चाहते हैं।
ए एल इद्रिसि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.