पिछले पेज पर वापस कैसे जाएं


366

क्या एंगुलर 2 में अंतिम पृष्ठ पर वापस जाने का एक स्मार्ट तरीका है?

कुछ इस तरह

this._router.navigate(LASTPAGE);

उदाहरण के लिए, पृष्ठ C में एक Go Backबटन है,

  • पृष्ठ A -> पृष्ठ C, इसे क्लिक करें, पृष्ठ A पर वापस जाएं

  • पृष्ठ B -> पृष्ठ C, इसे क्लिक करें, पृष्ठ B पर वापस जाएं।

क्या राउटर को यह इतिहास की जानकारी है?

जवाबों:


669

वास्तव में आप अंतर्निहित स्थान सेवा का लाभ ले सकते हैं, जो "बैक" एपीआई का मालिक है।

यहाँ (टाइपस्क्रिप्ट में):

import {Component} from '@angular/core';
import {Location} from '@angular/common';

@Component({
  // component's declarations here
})
class SomeComponent {

  constructor(private _location: Location) 
  {}

  backClicked() {
    this._location.back();
  }
}

संपादित करें : जैसा कि @ charith.arumapperuma द्वारा उल्लेख किया गया है Location, @angular/commonताकि import {Location} from '@angular/common';लाइन महत्वपूर्ण हो।


75
स्थान को कोणीय 2 के पुराने रिलीज में "कोणीय 2 / राउटर" से आयात किया जाना चाहिए। नए रिलीज में, यह "@ कोणीय / आम" से होना चाहिए।
charith.arumapperuma

2
यदि आपने इसे फ्रेमवर्क में बनाया है, तो मुझे "देशी" "window.history.back ()" का उपयोग करने का कोई कारण नहीं दिखता है; जो एक HTML5 फीचर है ( developer.mozilla.org/en-US/docs/Web/API/Window/history )
अमीर सेसन

7
इसके लायक क्या है, Locationराज्यों के लिए आधिकारिक Angular2 API प्रलेखन : "ध्यान दें: मार्ग परिवर्तनों को ट्रिगर करने के लिए राउटर सेवा का उपयोग करना बेहतर है। केवल स्थान का उपयोग करें यदि आपको रूटिंग के बाहर सामान्यीकृत URL के साथ सहभागिता या निर्माण करने की आवश्यकता है।" @ सासक्सा का जवाब स्पष्ट रूप Routerसे ऐसा करने के लिए उपयोग करने का एक तरीका दिखाता है । हालांकि, Locationविधि निश्चित रूप से अधिक सुविधाजनक है। क्या किसी को पता है कि Routerविधि विधि की तुलना में अधिक सही क्यों हो सकती है Location?
एंड्रयू विल्म्स

2
@ और: मैंने समस्या का सामना किया है, कि आप दो बार वापस नहीं जा सकते, यदि आप इस का उपयोग करते हैं। आप प्रारंभिक साइट पर वापस जाएंगे।
जोहान्स

1
@ yt61, निश्चित नहीं, शायद फिर से प्रयोज्य? या यदि आप विभिन्न मार्गों से एक निर्दिष्ट पृष्ठ पर जा सकते हैं, तो आप पहले से वापस जाने के लिए मार्ग नहीं जानते हैं।
अमीर सेसन

111

कोणीय 2.x / 4.x के अंतिम संस्करण में - यहाँ डॉक्स https://angular.io/api/common/Location है।

/* typescript */

import { Location } from '@angular/common';
// import stuff here

@Component({
// declare component here
})
export class MyComponent {

  // inject location into component constructor
  constructor(private location: Location) { }

  cancel() {
    this.location.back(); // <-- go back to previous location on cancel
  }
}

1
पिछली स्क्रीन पर वापस जाते समय हम सेवा में किसी वस्तु का उपयोग किए बिना इनपुट दर्ज किए गए मानों को बनाए रख सकते हैं।
विग्नेश

स्थान पर वापस एनीमेशन कैसे दिखाएं।
स्नो बेस

48

<button backButton>BACK</button>

आप इसे एक निर्देश में डाल सकते हैं, जिसे किसी भी क्लिक करने योग्य तत्व से जोड़ा जा सकता है:

import { Directive, HostListener } from '@angular/core';
import { Location } from '@angular/common';

@Directive({
    selector: '[backButton]'
})
export class BackButtonDirective {
    constructor(private location: Location) { }

    @HostListener('click')
    onClick() {
        this.location.back();
    }
}

उपयोग:

<button backButton>BACK</button>

वह तो कमाल है!
राफेल डे कास्त्रो

1
यदि आप इस पेज पर रिफ्रेश करते हैं, और "this.location.back ()" को ट्रिगर करने वाले बटन पर क्लिक करें, यह सिर्फ एक पेज रिफ्रेश को ट्रिगर करेगा। क्या कोई ऐसा तरीका है जो स्थान मॉड्यूल का पता लगा सकता है कि क्या पिछला रास्ता मौजूद है?
हेनरी लोकार्ज

अच्छा काम आदमी! ;)
एलिसोस्पी

ध्यान रखें कि यदि कोई उपयोगकर्ता सीधे उस पृष्ठ पर जाता है जहां बैक बटन मौजूद है और यदि वह एक बटन पर क्लिक करता है .. तो उसे ब्राउज़र (प्लेटफ़ॉर्म) इतिहास के अनुसार ऐप से पिछले पृष्ठ पर फेंक दिया जाएगा।
hastrb

भविष्य के पाठकों के लिए, एपीआई डॉक्स
hastrb

23

Angular 5.2.9 के साथ परीक्षण किया गया

आप एक बटन के बजाय एक लंगर का उपयोग करते हैं आप इसे एक बनाना चाहिए निष्क्रिय लिंक के साथ href="javascript:void(0)"कोणीय स्थान काम करने के लिए।

app.component.ts

import { Component } from '@angular/core';
import { Location } from '@angular/common';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent {

  constructor( private location: Location ) { 
  }

  goBack() {
    // window.history.back();
    this.location.back();

    console.log( 'goBack()...' );
  }
}

app.component.html

<!-- anchor must be a passive link -->
<a href="javascript:void(0)" (click)="goBack()">
  <-Back
</a>

मैं उपयोग करने के बजाय एक 'clickPreventDefault' निर्देश बनाने का सुझाव दूंगा javascript:void(0)। कुछ इस तरह ... @Directive({ selector: '[clickPreventDefault]' }) export class ClickPreventDefaultDirective { @HostListener("click", ["$event"]) onClick($event: Event) { $event.preventDefault(); } }
bmd

धन्यवाद @bmd, यह एक अधिक विस्तृत तरीका है, लेकिन यह भी काम करता है। एक अन्य काम करने वाला समाधान हर्फ का उपयोग नहीं करता है: <a (aclick)="goBack()">) हालांकि यह तरीका HTML Validators को पारित नहीं करता है।
JavierFuentes

20

आप routerOnActivate()अपने मार्ग वर्ग पर विधि को लागू कर सकते हैं , यह पिछले मार्ग के बारे में जानकारी प्रदान करेगा।

routerOnActivate(nextInstruction: ComponentInstruction, prevInstruction: ComponentInstruction) : any

तब आप router.navigateByUrl()से उत्पन्न डेटा का उपयोग और पास कर सकते हैं ComponentInstruction। उदाहरण के लिए:

this._router.navigateByUrl(prevInstruction.urlPath);

क्या यह अभी भी कोणीय 2.1.0 के लिए मान्य है?
smartmouse

1
@smartmouse मुझे ऐसा नहीं लगता, वहाँ के लिए प्रलेखन हैrouterOnActivate
Bojan Kogoj

4
इस उत्तर में रूटरऑनएक्टिवेट () लिंक टूटा हुआ है। लगता है कि यह रिलीज संस्करण में ऐसा करने का तरीका नहीं है।
rmcsharry

14

मेरे लिए भी काम करें जब मुझे फ़ाइल सिस्टम में वापस जाने की आवश्यकता हो। पीएस @ भाषा: "^ 5.0.0"

<button type="button" class="btn btn-primary" routerLink="../">Back</button>

7
मुझे उम्मीद थी कि यह काम करेगा, लेकिन यह ऊपर के अगले रूट पर वापस चला जाता है - पेज पर नेविगेट करने से पहले आप जिस रूट पर नहीं थे। यह जानने के लिए अच्छा है कि यह मौजूद है, लेकिन यदि आपके पास अपने घटक के लिए कई प्रवेश बिंदु हैं, तो यह विधि केवल इसके ऊपर के मार्ग पर वापस जाएगी, न कि जहां से आप उत्पन्न हुए हैं।
स्कॉट बायर्स

जैसा कि मैंने लिखा है "जब मुझे फ़ाइल सिस्टम में वापस जाने की आवश्यकता है" :) मेरे लिए, यह व्यवहार भी अप्रत्याशित था।
श्वेतशिव एंड्री

12

मैंने एक बटन बनाया है मैं अपने ऐप पर कहीं भी पुन: उपयोग कर सकता हूं।

इस घटक बनाएँ

import { Location } from '@angular/common';
import { Component, Input } from '@angular/core';

@Component({
    selector: 'back-button',
    template: `<button mat-button (click)="goBack()" [color]="color">Back</button>`,
})
export class BackButtonComponent {
    @Input()color: string;

  constructor(private location: Location) { }

  goBack() {
    this.location.back();
  }
}

जब आपको बैक बटन की आवश्यकता हो तो इसे किसी भी टेम्पलेट में जोड़ें।

<back-button color="primary"></back-button>

नोट: यह कोणीय सामग्री का उपयोग कर रहा है, यदि आप उस पुस्तकालय का उपयोग नहीं कर रहे हैं तो mat-buttonऔर निकालें color


क्या यह दृष्टिकोण राउटर आउटलेट के नाम के साथ काम करता है? कहो कि मेरे पास पृष्ठ पर कई हैं और केवल उनमें से एक पर वापस जाना चाहते हैं, क्या यह काम करेगा?
RRD

आपको उस स्थिति के लिए एक अलग दृष्टिकोण का उपयोग करना होगा। यदि आपके पास दो अलग-अलग राउटर आउटलेट्स में एक ही बैक बटन था, तो वे दोनों संभवत: एक ही काम करेंगे और पिछले राउटर आउटलेट पर वापस आ जाएंगे।
टॉड स्केलटन

नामित आउटलेट्स के लिए, मैंने पाया कि इस दृष्टिकोण ने काम किया: this.router.navigate (['../']], {सापेक्ष: इस: route})
rrd

इस घटक का उपयोग किसी अन्य घटक के अंदर कैसे करें?
आरएन कुशवाहा

12

इन सभी भयानक जवाबों के बाद, मुझे आशा है कि मेरा जवाब किसी को मिल जाएगा और उनकी मदद करेगा। मैंने मार्ग के इतिहास पर नज़र रखने के लिए एक छोटी सी सेवा लिखी। ये रहा।

import { Injectable } from '@angular/core';
import { NavigationEnd, Router } from '@angular/router';
import { filter } from 'rxjs/operators';

@Injectable()
export class RouteInterceptorService {
  private _previousUrl: string;
  private _currentUrl: string;
  private _routeHistory: string[];

  constructor(router: Router) {
    this._routeHistory = [];
    router.events
      .pipe(filter(event => event instanceof NavigationEnd))
      .subscribe((event: NavigationEnd) => {
        this._setURLs(event);
      });
  }

  private _setURLs(event: NavigationEnd): void {
    const tempUrl = this._currentUrl;
    this._previousUrl = tempUrl;
    this._currentUrl = event.urlAfterRedirects;
    this._routeHistory.push(event.urlAfterRedirects);
  }

  get previousUrl(): string {
    return this._previousUrl;
  }

  get currentUrl(): string {
    return this._currentUrl;
  }

  get routeHistory(): string[] {
    return this._routeHistory;
  }
}

कमोबेश सभी समाधानों की कोशिश करने के बाद, मुझे लगता है कि यह एक ऐसा लगातार सुसंगत तरीका है
A. D'Alfonso

क्या होगा यदि मैं विशेष लिंक पर पेज खोलता हूं और मैं चाहता हूं कि यह उस पेज पर वापस चला जाए?
इवान

8

जिस तरह से मैंने अलग-अलग पृष्ठ पर नेविगेट करते समय वर्तमान स्थान को पार करके एक क्वेरी परम जोड़ दिया

this.router.navigate(["user/edit"], { queryParams: { returnUrl: this.router.url }

इस क्वेरी को अपने घटक में पढ़ें

this.router.queryParams.subscribe((params) => {
    this.returnUrl = params.returnUrl;
});

यदि रिटर्न यूआरएल मौजूद है तो बैक बटन को सक्षम करें और जब उपयोगकर्ता बैक बटन पर क्लिक करे

this.router.navigateByUrl(this.returnUrl); // Hint taken from Sasxa

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


ActivatedRoute को आयात करने की आवश्यकता है और क्वेरीपैर सदस्यता (जैसे, this.route.queryParams.subscribe) पर राउटर के बजाय का उपयोग करें, लेकिन अन्यथा, काम करने लगता है!
स्टीफन कैसर

मेरे लिए यह कोणीय 4 में भी राउटर के साथ ठीक काम कर रहा है
पुनेथ राय

1
सबसे अच्छा जवाब, लेकिन कोणीय 5 (एक्स तक) में आपको "एक्टिनेटेडआउट" की एक वस्तु को इंजेक्ट करना होगा और इस ऑब्जेक्ट पर क्वेरीपराम का उपयोग करना होगा, जैसा कि स्टीफन कैसर ने पहले ही कहा था।
सतरिया


3

पृष्ठ को रीफ्रेश किए बिना वापस जाने के लिए, हम HTML में जावास्क्रिप्ट की तरह कर सकते हैं : history.back ()

<a class="btn btn-danger" href="javascript:history.back()">Go Back</a>

मैं Locationइसके बजाय सेवा का उपयोग करने की सलाह दूंगा। सरकारी एपीआई
hastrb


2

कोणीय 4 उपयोग में preserveQueryParams, पूर्व:

url: /list?page=1

<a [routerLink]="['edit',id]" [preserveQueryParams]="true"></a>

लिंक पर क्लिक करते समय, आपको पुनर्निर्देशित किया जाता है edit/10?page=1, संरक्षण पैरामेट्स

रेफरी: https://angular.io/docs/ts/latest/guide/router.html# !# link-parameters-array


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