কৌনিকটিতে পূর্ববর্তী পৃষ্ঠার ইউআরএল কীভাবে নির্ধারণ করবেন?


99

ধরুন আমি পৃষ্ঠা যা URL আছে বর্তমানে am /user/:id। এখন এই পৃষ্ঠাটি থেকে আমি পরবর্তী পৃষ্ঠায় নেভিগেট করব :id/posts

এখন একটি উপায় আছে, আমি পরীক্ষা করতে পারবেন যাতে, পূর্ববর্তী URL কি অর্থাত /user/:id

নীচে আমার রুট আছে

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

উত্তর:


80

আপনি রুট পরিবর্তনগুলিতে সাবস্ক্রাইব করতে এবং বর্তমান ইভেন্টটি সঞ্চয় করতে পারেন যাতে পরবর্তী ঘটনাটি ঘটলে আপনি এটি ব্যবহার করতে পারেন

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
ধন্যবাদ @ জন্টার আপনি সর্বদা আমার দিন বাঁচান।
চন্দ্র শেখর

29
এটি আমার জন্য পূর্ববর্তী রুটগুলির তালিকা করে না, কেবলমাত্র বর্তমান রুট।
ডেভিড আগুয়েরে

4
আপনি যা আশা করেন তার উপর নির্ভর করে। nullপূর্বের কোনও রুট নেই বলেই এটি প্রথমবার । রুট রাউটারে আপনাকে এটিও করতে হবে, অন্যথায় আপনি কেবল তখনই পাবেন যখন আপনি এই উপাদানটির শিশু রুটের মধ্যে নেভিগেট করবেন।
গন্টার জ্যাচবাউয়ার

8
কনস্ট্রাক্টর প্রথমবারের জন্য কার্যকর করা হলে এটি পূর্ববর্তী url দেয় না।
একাইৎজ হার্নান্দেজ ট্রয়েস

9
কনস্ট্রাক্টর প্রথমবারের জন্য কার্যকর করা হলে আপনি পূর্ববর্তী ইউআরএল হিসাবে কী মান আশা করবেন?
গন্টার জ্যাচবাউর

108

হতে পারে অন্যান্য সমস্ত উত্তর কৌনিক ২. এক্স এর জন্য are

এখন এটি কৌণিক 5. এক্স এর জন্য কাজ করে না। আমি এটি নিয়ে কাজ করছি।

শুধুমাত্র নেভিগেশনএন্ডের সাথে আপনি পূর্ববর্তী ইউআরএল পেতে পারবেন না।

কারণ রাউটার "নেভিগেশনস্টার্ট", ​​"রাউটস পরিচিতি", ..., থেকে "নেভিগেশনএন্ড" এ কাজ করে।

আপনি চেক করতে পারেন

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

তবে এখনও আপনি "নেভিগেশনস্টার্ট" দিয়েও পূর্ববর্তী url পেতে পারবেন না।

এখন আপনার জোড়া লাগাতে হবে।

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 এ পরিবর্তনের পদক্ষেপ।

সুতরাং এটি ফিল্টার এবং এটি থেকে পূর্ববর্তী url পেতে।

সর্বশেষ তবে কম নয়,

এই কোডটি প্যারেন্ট উপাদান বা উচ্চতরতে (উদাহরণস্বরূপ, app.componal.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);
});

4
পরিষেবা হিসাবে প্রয়োগ করা হয়েছে এবং এটি দুর্দান্ত কাজ করে। আমি কৌনিক 6.1.7 ব্যবহার করছি।
এ এল ইদ্রিসি

4
@ tjvg1991 রিফ্রেশ পৃষ্ঠার অর্থ আপনি মেমরির ডেটা হারিয়েছেন। আপনি যদি পূর্বের ডেটা রাখেন তবে আপনার স্থানীয় স্টোরেজ বা কুকি ব্যবহার করা উচিত। (আপনার স্থানীয় নয় স্মৃতিতে ডেটা সংরক্ষণ করুন)
BYUNGJU জিন

আমি শুধু আপভোট বোতামটি মেরে ফেলতে চাই থ্যাঙ্কস ম্যান।
মুহাম্মদ উমাইর

@ বায়ুঞ্জজিন এর জন্য ধন্যবাদ!
জন

@ বায়ঙ্গজু জিন আপনাকে ধন্যবাদ আমার জন্য কাজ করে। পুনঃনির্দেশ লিঙ্ক থেকে আমি কীভাবে পরমের মান পেতে পারি উদাহরণস্বরূপ ইভেন্টগুলির জন্য বলুন [0] .urlAfterRedirects আমাকে '/ inventoryDetails; পরীক্ষা = 0; id = 45' দেয়, আমি এ থেকে আইডিটির মান পেতে চাই। সাবস্ট্রিং ব্যবহার না করে কীভাবে করব।
জেএনপিডাব্লু

49

একটি ইনজেকশনযোগ্য পরিষেবা তৈরি করুন:

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
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);
  }

  //...

}

4
আমি মনে করি এটি সবচেয়ে মার্জিত সমাধান। : এর নতুন ফিল্টার & pairwise সমাধান সঙ্গে এই কোড একত্রীকরণ করার চেষ্টা করুন stackoverflow.com/a/35287471/518879
danger89

4
পুনশ্চ. এই রাউটারএক্টস সার্ভিসটিকে অ্যাপস-রাউটিং.মডিউল.টসগুলিতে (আমার ক্ষেত্রে) যুক্ত করতে ভুলবেন না, যেমন:@NgModule({ ..., providers: [RouterExtService]}) export class AppRoutingModule { }
বিপদ 89

ঠিক আছে এই পরিষেবা সমাধানের সাথে একটি বড় সমস্যা আছে .. আমার ক্ষেত্রে আমি routerExtService.getPreviousUrl()কোনও উপাদানটিতে ব্যবহৃত কোনও পরিষেবা নির্মাণকারীকে পদ্ধতিটি কল করি । কিছু কারণে এটি প্রকৃত আপডেটের চেয়ে আগে বলা হয়। মানে আমাদের একটি সময় নির্ভরতা! আমি সাবজেক্ট ব্যবহার করা অনেক সহজ বলে মনে করি।
বিপদ 89

ভাল, এটি একটি ছোট প্রকল্পে আমার পক্ষে ভাল কাজ করেছে। আপনার প্রয়োজন অনুসারে এর জন্য কিছুটা টুইক দরকার। আপনি কি সমস্যার সমাধান করেছেন?
জুলিয়ানো

আমি বর্তমানে আমার ইউআরএলে আমার রাষ্ট্র 'স্টোর' করতে তথাকথিত ইউআরএল ম্যাট্রিক্স পরামিতিগুলি ব্যবহার করছি , ডিফল্টরূপে ব্রাউজারের ইউআরএল এখন ব্যাক বোতামটি ব্যবহার করার সময় রাজ্যটিকে সঞ্চয় করে। 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 })
বিপদ 89

20

পূর্ববর্তী url স্ট্রিং হিসাবে পাওয়ার জন্য কৌণিক 6 আপডেট হওয়া কোড updated

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
            });
    }

এটি কোনও প্রহরী দ্বারা অবরুদ্ধ হওয়া ইউআরএলটি ফিরিয়ে দেয়, কেবলমাত্র পূর্ববর্তী ইউআরএল সক্রিয় করা (গার্ড দ্বারা অবরুদ্ধ নয়) পাওয়ার কোনও উপায় আছে?
এক্সকম্প্প

4
রাউটারটি পর্যবেক্ষণযোগ্য থেকে সাবস্ক্রাইব করার সর্বোত্তম উপায় সম্পর্কিত কোনও ইঙ্গিত?
j4v1

কাজ! "নেভিগেশনএন্ড" কেন কাজ করে না তা আমি সত্যিই জানি না
ডেভিডউইলিংস

13

এটি আমার জন্য কৌণিক> = 6.x সংস্করণে কাজ করেছে:

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

10

আমি কৌনিক 8 ব্যবহার করছি এবং @ ফ্র্যাঙ্কলিন-পিউইসের উত্তরটি সমস্যার সমাধান করে। আমার ক্ষেত্রে, সাবস্ক্রাইবটির মধ্যে পূর্ববর্তী ইউআরএলটি কিছু দৃষ্টিভঙ্গির সাথে সংযুক্ত থাকলে কিছু পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে।

আমি যে কার্যকারিতাটি ব্যবহার করেছি তা হ'ল রুট নেভিগেশনে urচ্ছিক প্যারামিটার হিসাবে পূর্ববর্তী ইউআরএল পাঠানো।

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.com অংশে ইনজেক্ট করুন

  constructor(
    private routeEventsService: RouteEventsService
  )

অবশেষে আপনি যে উপাদানটি চান সেটিতে সংরক্ষিত পূর্ববর্তী রুটটি ব্যবহার করুন

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

এটি সত্যিই ভাল কাজ করে। তবে আমি একটি দ্রুত প্রশ্ন আছে। আপনি কি কখনও সাবস্ক্রাইব করেন?
w0ns88

যোগ করুন (1) এর মতো -> পেয়ারওয়াইজ (), নিন (1)) সাবস্ক্রাইব করুন ((ই: যে কোনও)
মুকুস

4
মনে রাখবেন যে আপনি যদি @Injectable({ providedIn: 'root' })পরিষেবাটি ব্যবহার করেন তবে স্বয়ংক্রিয়ভাবে প্রকল্পের রুট মডিউল (অ্যাপমোডিয়াল) এ লোড হয়ে যায় এবং সুতরাং আপনাকে এটি ম্যানুয়ালি সরবরাহ করতে হবে না app.module। বিশদ জন্য ডক্স দেখুন । এই উত্তরে
এইচকিড

5

অ্যাঙ্গুলার 7+ এর জন্য

আসলে কৌণিক ular.২ এর পরে পূর্ববর্তী ইউআরএল সংরক্ষণ করার জন্য কোনও পরিষেবা ব্যবহার করার দরকার নেই। আপনি লগইন পৃষ্ঠায় লিঙ্ক করার আগে শেষ 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

@ গন্তেরজ্যাচবাউয়ার এছাড়াও আপনি এটি লোকালস্টোরে সংরক্ষণ করতে পারেন তবে আমি সেটিকে পছন্দ করি না) পরিষেবাতে সঞ্চয় করা এবং সেখান থেকে এই মানটি পাওয়া ভাল

 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

একজন প্রহরার অভ্যন্তরে পূর্ববর্তী ইউআরএলটি অ্যাক্সেস করার জন্য আমার কিছুটা লড়াই হয়েছিল।
কাস্টম সমাধান বাস্তবায়ন না করে, এইটি আমার পক্ষে কাজ করছে।

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

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

প্রাথমিক url পূর্ববর্তী url পৃষ্ঠা হবে।


-2

উপরোক্ত সমস্ত উত্তর একাধিকবার ইউআরএল লোড হবে। যদি ব্যবহারকারী অন্য কোনও উপাদানও দেখে থাকেন তবে এই কোডগুলি লোড হবে।

ব্যবহার করা এত ভাল, পরিষেবা তৈরির ধারণা। https://commune.wia.io/d/22-access-the- পূর্ববর্তী-route-in- আপনার-angular-5-app

এটি Angular এর সমস্ত সংস্করণে ভাল কাজ করবে। (দয়া করে এটি আপনার অ্যাপ্লিকেশন.মডিউল ফাইলের সরবরাহকারী অ্যারেতে যুক্ত করার বিষয়টি নিশ্চিত করুন!)


-2

আরএক্সজেক্স থেকে পেয়ারওয়াইজ ব্যবহার করে আপনি এটি আরও সহজ অর্জন করতে পারেন। 'আরএক্সজেএস / অপারেটর' থেকে ফিল্টার, পেয়ারওয়াইজ import আমদানি করুন;

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 এ ফিরে আসে। আমি আশা করি এটি কাউকে সহায়তা করবে;)


এটি কার্যকর হবে না, আপনি রাউটারের পথে এগিয়ে যাওয়ার কথা বলছেন, ওপি যেমন বলেছিল তার আগের ইউআরএলের চেয়ে।
ফ্রেডেরিক ইয়েসিড পেঁয়া সানচেজ

আপনার url প্যারামিটারগুলির সাথে জটিল বা পিতামাতার মতো পথ না থাকলে এটি কাজ করে না। আপনি কেবল "কিছু / পিতা / মাতা / সন্তানের" থেকে "কিছু / পিতামাতাকে" যেতে চাইলে এটি কাজ করে।
এ। এল ইদ্রিসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.