Is there anyway to send data as parameter with router.navigate? I mean, something like this example, as you can see the route has a data parameter, but doing this it's not working:
this.router.navigate(["heroes"], {some-data: "othrData"})
because some-data is not a valid parameter. How can I do that? I don't want to send the parameter with queryParams.
-
I think it should be other way like in AngularJS, where we were able to do something like $state.go('heroes', {some-data: "otherData"})Motomine– Motomine2017年07月01日 18:55:34 +00:00Commented Jul 1, 2017 at 18:55
-
Use my approach npmjs.com/package/ngx-navigation-with-data last comment by me, best for everyoneVirendra Yadav– Virendra Yadav2018年11月28日 06:23:26 +00:00Commented Nov 28, 2018 at 6:23
-
2Routing is a complex feature in Angular and definitely worth learning! Here you may find interesting details about passing data via the routing: indepth.dev/tutorials/angular/… This guide goes through various techniques about using static data in routing definition and dynamic data (state) during specific navigation.Maciej Wojcik– Maciej Wojcik2022年07月23日 11:47:12 +00:00Commented Jul 23, 2022 at 11:47
9 Answers 9
There is a lot of confusion on this topic because there are so many different ways to do it.
Here are the appropriate types used in the following screen shots:
private route: ActivatedRoute
private router: Router
1) Required Routing Parameters:
2) Route Optional Parameters:
3) Route Query Parameters:
4) You can use a service to pass data from one component to another without using route parameters at all.
For an example see: https://blogs.msmvps.com/deborahk/build-a-simple-angular-service-to-share-data/
I have a plunker of this here: https://plnkr.co/edit/KT4JLmpcwGBM2xdZQeI9?p=preview
26 Comments
route type is ActivatedRoute, not Router.There is a new method what came with Angular 7.2.0
https://angular.io/api/router/NavigationExtras#state
Send:
this.router.navigate(['action-selection'], { state: { example: 'bar' } });
Receive:
constructor(private router: Router) {
console.log(this.router.getCurrentNavigation().extras.state.example); // should log out 'bar'
}
You can find some additional info here:
https://github.com/angular/angular/pull/27198
The link above contains this example which can be useful: https://stackblitz.com/edit/angular-bupuzn
14 Comments
ngOnInit() as this.router.getCurrentNavigation().extrasLatest version of angular (7.2 +) now has the option to pass additional information using NavigationExtras.
Home component
import {
Router,
NavigationExtras
} from '@angular/router';
const navigationExtras: NavigationExtras = {
state: {
transd: 'TRANS001',
workQueue: false,
services: 10,
code: '003'
}
};
this.router.navigate(['newComponent'], navigationExtras);
newComponent
test: string;
constructor(private router: Router) {
const navigation = this.router.getCurrentNavigation();
const state = navigation.extras.state as {
transId: string,
workQueue: boolean,
services: number,
code: string
};
this.test = "Transaction Key:" + state.transId + "<br /> Configured:" + state.workQueue + "<br /> Services:" + state.services + "<br /> Code: " + state.code;
}
Output
Hope this would help!
6 Comments
I needed access to the data in CustomRouteReuseStrategy and I couldn't inject the Router there due to a circular dependency but you can use the Location object to read the state as well.
Send:
this.router.navigate(['action-selection'], { state: { example: 'bar' } });
Receive:
import { Location } from '@angular/common';
constructor(private location: Location) {
console.log(this.location.getState().example); // should log out 'bar'
}
2 Comments
state as bound input to the same element you're providing routerLink to. Eg: <button [routerLink]="['action-selection']" [state]="{ example: 'bar' }"> Navigate with State </button>Since Angular 15, this.router.getCurrentNavigation() might return null, because the component is instantiated after the navigation.
The alternative is to access the state from the Location (the one from @angular/common)
import { Location } from '@angular/common';
constructor(private location: Location) {
location.getState() // do what you want
}
2 Comments
In navigateExtra we can pass only some specific name as argument otherwise it showing error like below: For Ex- Here I want to pass customer key in router navigate and I pass like this-
this.Router.navigate(['componentname'],{cuskey: {customerkey:response.key}});
but it showing some error like below:
Argument of type '{ cuskey: { customerkey: any; }; }' is not assignable to parameter of type 'NavigationExtras'.
Object literal may only specify known properties, and 'cuskey' does not exist in type 'NavigationExt## Heading ##ras'
.
Solution: we have to write like this:
this.Router.navigate(['componentname'],{state: {customerkey:response.key}});
Comments
@dev-nish Your code works with little tweaks in them. make the
const navigationExtras: NavigationExtras = {
state: {
transd: 'TRANS001',
workQueue: false,
services: 10,
code: '003'
}
};
into
let navigationExtras: NavigationExtras = {
state: {
transd: '',
workQueue: ,
services: ,
code: ''
}
};
then if you want to specifically sent a type of data, for example, JSON as a result of a form fill you can send the data in the same way as explained before.
Comments
getStateById(stateId) {
return this.http.get<any>(environment.user_service_url + "/getStateById",
{params:{"stateId": stateId}});
}
Comments
Best I found on internet for this is ngx-navigation-with-data. It is very simple and good for navigation the data from one component to another component. You have to just import the component class and use it in very simple way. Suppose you have home and about component and want to send data then
HOME COMPONENT
import { Component, OnInit } from '@angular/core';
import { NgxNavigationWithDataComponent } from 'ngx-navigation-with-data';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
constructor(public navCtrl: NgxNavigationWithDataComponent) { }
ngOnInit() {
}
navigateToABout() {
this.navCtrl.navigate('about', {name:"virendta"});
}
}
ABOUT COMPONENT
import { Component, OnInit } from '@angular/core';
import { NgxNavigationWithDataComponent } from 'ngx-navigation-with-data';
@Component({
selector: 'app-about',
templateUrl: './about.component.html',
styleUrls: ['./about.component.css']
})
export class AboutComponent implements OnInit {
constructor(public navCtrl: NgxNavigationWithDataComponent) {
console.log(this.navCtrl.get('name')); // it will console Virendra
console.log(this.navCtrl.data); // it will console whole data object here
}
ngOnInit() {
}
}
For any query follow https://www.npmjs.com/package/ngx-navigation-with-data
Comment down for help.