Angular에서 라우팅 경로를 통해 데이터 전송


181

router.navigate를 사용하여 데이터를 매개 변수로 보낼 수 있습니까? 나는, 같은 뜻 당신이 경로 데이터 매개 변수가 볼 수 있지만이 일을이 작동하지 않습니다으로, 예를 들어 :

this.router.navigate(["heroes"], {some-data: "othrData"})

일부 데이터는 유효한 매개 변수가 아니기 때문입니다. 어떻게해야합니까? queryParams와 함께 매개 변수를 보내고 싶지 않습니다.


우리가 $ state.go ( 'heroes', {some-data : "otherData"}) 같은 것을 할 수있는 AngularJS와 같은 다른 방식이어야한다고 생각합니다
Motomine

경로를 통해 데이터를 공유하는 3 가지 간단한 방법 -angulartutorial.net/2017/12/…
Prashobh

내 방식 사용 npmjs.com/package/ngx-navigation-with-data 날에 의해 최근 코멘트 모두를위한 최선의
Virendra 야다 브

답변:


514

여러 가지 방법이 있기 때문에이 주제에 대해 많은 혼동이 있습니다.

다음 스크린 샷에 사용되는 적절한 유형은 다음과 같습니다.

private route: ActivatedRoute
private router: Router

1) 필수 라우팅 매개 변수 :

여기에 이미지 설명을 입력하십시오

2) 경로 옵션 매개 변수 :

여기에 이미지 설명을 입력하십시오

3) 경로 쿼리 매개 변수 :

여기에 이미지 설명을 입력하십시오

4) 경로 매개 변수를 전혀 사용하지 않고 서비스를 사용하여 한 구성 요소에서 다른 구성 요소로 데이터를 전달할 수 있습니다.

예를 보려면 https://blogs.msmvps.com/deborahk/build-a-simple-angular-service-to-share-data/ 를 참조하십시오.

나는 여기에 plunker를 가지고있다 : https://plnkr.co/edit/KT4JLmpcwGBM2xdZQeI9?p=preview


답변 주셔서 감사합니다! 2)와 3)의 차이점은 무엇입니까? 둘 다 URL에 "? parameter ="를 추가하기 때문입니다. 4)에 대한 예를 들어 주시겠습니까? 어떻게해야할지 모르겠습니다.
Motomine

다른 URL을 표시하고 서비스를 통해 데이터를 전달하는 방법에 대한 블로그 게시물 및 plunker에 대한 링크를 제공하기 위해 답변으로 업데이트했습니다. URL은 위에 표시된대로 선택적 및 쿼리 매개 변수와 다릅니다. 플러스 쿼리 매개 변수는 경로에 걸쳐 유지 될 수 있습니다.
DeborahK

6
app.pluralsight.com/library/courses/angular-routing/… 을 다루는 라우팅에 대한 Pluralsight 코스도 있습니다 . 자세한 정보가 필요하면 무료 주에 등록 할 수 있습니다.
DeborahK

3
데이터는 실행중인 응용 프로그램 내에서만 "공유"됩니다. 사용자가 페이지를 새로 고치면 전체 응용 프로그램이 서버에서 다시로드되므로 응용 프로그램에서 이전 상태가 유지되지 않습니다. 일반 응용 프로그램과 관련하여 생각하면 사용자가 새로 고칠 때 응용 프로그램을 닫았다가 다시 여는 것과 같습니다. 새로 고친 후에 상태를 유지해야하는 경우 로컬 저장소 또는 서버와 같은 곳에 저장해야합니다.
DeborahK

2
작은 힌트 : routetype is ActivatedRoute, not Router.
Arsen Khachaturyan

156

Angular 7.2.0과 함께 제공되는 새로운 방법이 있습니다

https://angular.io/api/router/NavigationExtras#state

보내다:

this.router.navigate(['action-selection'], { state: { example: 'bar' } });

받기 :

constructor(private router: Router) {
  console.log(this.router.getCurrentNavigation().extras.state.example); // should log out 'bar'
}

추가 정보를 여기에서 찾아 볼 수 있습니다.

https://github.com/angular/angular/pull/27198

위의 링크에는 다음 예제가 포함되어 있습니다. https://stackblitz.com/edit/angular-bupuzn


11
이것은 Angular 7의 새로운 기능을 고려한 정답입니다.
Randy

2
이 방법으로 사용자가 브라우저 새로 고침을 어떻게 처리합니까? 이 경우 내비게이션 엑스트라의 데이터가 사라져 새로 고침시 다시 사용할 기회가 없습니다.
tobi_b

1
@tobi_b 당신이 옳다고 생각합니다. 새로 고침 한 후에는 도달 할 수 없습니다. 새로 고친 후 필요하면 허용 된 답변의 방법이 더 좋습니다.
Véger Lóránd

3
그렇기 때문에 생성자의 this.router.getCurrentNavigation ()에서만 데이터를 가져올 수 있습니다. ngOnInit ()와 같은 다른 곳에서 필요한 경우 "history.state"를 통해 데이터에 액세스 할 수 있습니다. 문서에서 : "상태가 모든 탐색에 전달되었습니다. 탐색이 실행되는 동안 router.getCurrentNavigation ()에서 리턴 된 추가 오브젝트를 통해이 값에 액세스 할 수 있습니다. 탐색이 완료되면이 값은 위치에있을 때 history.state에 기록됩니다. 이 경로를 활성화하기 전에 .go 또는 location.replaceState 메소드가 호출됩니다. "
Véger Lóránd

8
또한 다음과 ngOnInit()같이 엑스트라 객체를받지 않도록하십시오.this.router.getCurrentNavigation().extras
hastrb

26

최신 버전의 각도 (7.2 +)에는 NavigationExtras를 사용하여 추가 정보를 전달할 수있는 옵션이 있습니다.

홈 컴포넌트

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

산출

여기에 이미지 설명을 입력하십시오

이것이 도움이되기를 바랍니다!


1

@ dev-nish 코드는 약간의 수정만으로 작동합니다. ~을 만들다

const navigationExtras: NavigationExtras = {
  state: {
    transd: 'TRANS001',
    workQueue: false,
    services: 10,
    code: '003'
  }
};

으로

let navigationExtras: NavigationExtras = {
  state: {
    transd: '',
    workQueue: ,
    services: ,
    code: ''
  }
};

그런 다음 양식 채우기의 결과로 JSON과 같은 데이터 유형을 구체적으로 보내려면 이전에 설명한 것과 동일한 방식으로 데이터를 보낼 수 있습니다.


0

navigateExtra에서는 특정 이름 만 인수로 전달할 수 있습니다. 그렇지 않으면 아래와 같은 오류가 표시됩니다. 예를 들어 라우터 탐색에서 고객 키를 전달하고 다음과 같이 전달합니다.

this.Router.navigate(['componentname'],{cuskey: {customerkey:response.key}});

그러나 아래와 같은 오류가 표시됩니다.

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'

.

해결책 : 다음과 같이 작성해야합니다.

this.Router.navigate(['componentname'],{state: {customerkey:response.key}});

-2

내가 인터넷에서 찾은 최고의 것은 ngx-navigation-with-data 입니다. 한 구성 요소에서 다른 구성 요소로 데이터를 탐색하는 것은 매우 간단하고 좋습니다. 구성 요소 클래스를 가져 와서 매우 간단한 방법으로 사용해야합니다. 집에 구성 요소가 있고 데이터를 보내고 싶다고 가정하십시오.

홈 컴포넌트

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

}

구성 요소 정보

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() {
 }

}

모든 문의 사항은 https://www.npmjs.com/package/ngx-navigation-with-data를 따르십시오

도움을 요청하십시오.


params 또는 백그라운드로 데이터를 전송합니까?
Marium Malik

@MariumMalik을 이해할 수 없습니다. 설명적인 방식으로 질문 해 주시겠습니까?
Virendra Yadav

네, 그것은 @MariumMalik 않습니다
Virendra 야다 브

3
"인터넷에서 찾았습니다"가 아니라이 저자 인 것 같습니다. 비슷한 기능을 구현하는 Angular 7 스레드에서 스팸 메일을 보내지 말아야 합니다 ( github.com/angular/angular/pull/27198 )
IrishDubGuy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.