[angular] Angular 라우팅 구성 요소에 데이터를 전달하려면 어떻게합니까?

내 Angular 2 경로 템플릿 중 하나 ( FirstComponent )에 버튼이 있습니다.

first.component.html

<div class="button" click="routeWithData()">Pass data and route</div>

목표 는 달성하는 것입니다.

버튼 클릭-> 다른 구성 요소를 지시문으로 사용하지 않고 데이터를 유지하면서 다른 구성 요소로 라우팅합니다.

이것은 내가 시도한 것입니다 …

첫 번째 접근법

같은보기에서 나는 사용자 상호 작용을 기반으로 동일한 데이터를 수집 저장합니다.

first.component.ts

export class FirstComponent {
     constructor(private _router: Router) { }

     property1: number;
     property2: string;
     property3: TypeXY; // this a class, not a primitive type

    // here some class methods set the properties above

    // DOM events
    routeWithData(){
         // here route
    }
}

일반적으로 다음 으로

 this._router.navigate(['SecondComponent']);

결국 데이터를 전달

 this._router.navigate(['SecondComponent', {p1: this.property1, p2: property2 }]);

반면 매개 변수가있는 링크의 정의는

@RouteConfig([
      // ...
      { path: '/SecondComponent/:p1:p2', name: 'SecondComponent', component: SecondComponent} 
)]

이 접근법의 문제는 복잡한 데이터 (예 : property3와 같은 객체 )를 URL로 전달할 수 없다는 것입니다 .

2 차 접근법

대안은 FirstComponent 에서 SecondComponent 를 지시문 으로 포함하는 것 입니다.

  <SecondComponent [p3]="property3"></SecondComponent>

그러나 해당 구성 요소 로 라우팅 하고 싶지 는 않습니다.

3 차 접근법

내가 볼 수있는 가장 실용적인 해결책은 서비스 (예 : FirstComponentService)를 사용하여

  • FirstComponent의 routeWithData ()에 데이터 (_firstComponentService.storeData ())를 저장 하십시오.
  • 검색 의 (_firstComponentService.retrieveData ()) 데이터를 ngOnInit ()을SecondComponent

이 접근법은 완벽하게 실행 가능한 것처럼 보이지만 이것이 목표를 달성하는 가장 쉽고 우아한 방법인지 궁금합니다.

일반적으로 구성 요소간에 데이터를 전달하는 다른 잠재적 인 접근법 이 누락되었는지 , 특히 코드의 양이 적을 지 알고 싶습니다.



답변

4.0.0 업데이트

자세한 내용은 각도 문서를 참조하십시오 https://angular.io/guide/router#fetch-data-before-navigating

실물

서비스를 사용하는 것이 좋습니다. 경로 매개 변수에서는 브라우저 URL 표시 줄에 반영하려는 데이터 만 전달해야합니다.

참조 https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service

RC.4와 함께 제공된 라우터는 다시 소개합니다 data

constructor(private route: ActivatedRoute) {}
const routes: RouterConfig = [
  {path: '', redirectTo: '/heroes', pathMatch : 'full'},
  {path : 'heroes', component : HeroDetailComponent, data : {some_data : 'some value'}}
];
class HeroDetailComponent {
  ngOnInit() {
    this.sub = this.route
      .data
      .subscribe(v => console.log(v));
  }

  ngOnDestroy() {
    this.sub.unsubscribe();
  }
}

https://github.com/angular/angular/issues/9757#issuecomment-229847781 에서 Plunker를 참조하십시오.


답변

우리는 각도 1.x에서와 같이 각도 2에 $ rootScope 종류 가 없기 때문에 생각합니다 . ngOnDestroy 에서 데이터를 서비스로 전달 하는 동안 ngOnInit 함수 에서 서비스에서 데이터를 가져 오는 동안 angular 2 공유 서비스 / 클래스를 사용할 수 있습니다 .

여기서는 DataService를 사용하여 영웅 객체를 공유하고 있습니다.

import { Hero } from './hero';
export class DataService {
  public hero: Hero;
}

첫 페이지 컴포넌트에서 오브젝트를 전달하십시오.

 ngOnDestroy() {
    this.dataService.hero = this.hero;
 }

두 번째 페이지 구성 요소에서 객체를 가져옵니다.

 ngOnInit() {
    this.hero = this.dataService.hero;
 }

다음은 예입니다 : plunker


답변

<div class="button" click="routeWithData()">Pass data and route</div>

각도 6 또는 다른 버전에서 가장 쉬운 방법은 전달하려는 데이터 양으로 경로를 정의하는 것입니다.

{path: 'detailView/:id', component: DetailedViewComponent}

내 경로 정의에서 볼 수 있듯이 /:id라우터 탐색을 통해 구성 요소에 전달하려는 데이터에 스탠드를 추가했습니다 . 따라서 코드는 다음과 같습니다

<a class="btn btn-white-view" [routerLink]="[ '/detailView',list.id]">view</a>

id구성 요소 를 읽으려면 다음 ActivatedRoute 과 같이 가져 오십시오.

import { ActivatedRoute } from '@angular/router'

그리고 ngOnInit당신이 데이터를 검색하는 곳

ngOnInit() {
       this.sub = this.route.params.subscribe(params => {
        this.id = params['id'];
        });
        console.log(this.id);
      }

이 기사에서 더 많은 것을 읽을 수 있습니다
https://www.tektutorialshub.com/angular-passing-parameters-to-route/


답변

Angular 7.2.0에서는 라우팅 된 구성 요소 사이를 탐색 할 때 데이터를 전달하는 새로운 방법을 도입했습니다.

@Component({
  template: `<a (click)="navigateWithState()">Go</a>`,
})
export class AppComponent  {
  constructor(public router: Router) {}
  navigateWithState() {
    this.router.navigateByUrl('/123', { state: { hello: 'world' } });
  }
}

또는:

@Component({
  selector: 'my-app',
  template: `
  <a routerLink="/details" [state]="{ hello: 'world' }">Go</a>`,
})
export class AppComponent  {}

상태를 읽으려면 window.history.state탐색이 완료된 후 속성에 액세스 할 수 있습니다 .

export class PageComponent implements OnInit {
  state$: Observable<object>;

  constructor(public activatedRoute: ActivatedRoute) {}

  ngOnInit() {
    this.state$ = this.activatedRoute.paramMap
      .pipe(map(() => window.history.state))
  }
}


답변

내가 아닌 슈퍼 똑똑한 사람 (tmburnell)은 경로 데이터를 다시 쓰도록 제안합니다.

let route = this.router.config.find(r => r.path === '/path');
route.data = { entity: 'entity' };
this.router.navigateByUrl('/path');

의견에서 여기 에서 볼 수 있듯이 .

누군가가 이것을 유용하게 사용하기를 바랍니다.


답변

나는 이것이 다른 방법 으로이 문제에 좋지 않다. 가장 좋은 방법은 각도 별로 쿼리 매개 변수입니다Router .

쿼리 매개 변수를 직접 전달

이 코드를 사용하면 탐색 할 수 있습니다 url하여 paramsHTML 코드에서 :

<a [routerLink]="['customer-service']" [queryParams]="{ serviceId: 99 }"></a>

다음에 의해 쿼리 매개 변수 전달 Router

당신은 당신의 constructor마음에 라우터를 주입해야합니다 :

constructor(private router:Router){

}

이제 다음과 같이 사용하십시오.

goToPage(pageNum) {
    this.router.navigate(['/product-list'], { queryParams: { serviceId: serviceId} });
}

이제 Router다른 곳 에서 읽으려면 다음과 같이 Component사용해야합니다 ActivatedRoute.

constructor(private activateRouter:ActivatedRouter){

}

그리고 subscribe그것은 :

  ngOnInit() {
    this.sub = this.route
      .queryParams
      .subscribe(params => {
        // Defaults to 0 if no query param provided.
        this.page = +params['serviceId'] || 0;
      });
  }


답변

2019 년이며 여기에 원하는 답변에 따라 많은 답변이 작동합니다. URL (매개 변수, 쿼리)에 보이지 않는 내부 상태를 전달하려면 state7.2 오늘 부터 사용할 수 있습니다 ( 오늘 방금 배운 것처럼 :)).

블로그 (신용 Tomasz Kula)-경로로 이동하십시오 ….

… ts에서 : this.router.navigateByUrl('/details', { state: { hello: 'world' } });

… HTML 템플릿에서 : <a routerLink="/details" [state]="{ hello: 'world' }">Go</a>

대상 구성 요소에서 가져옵니다.

constructor(public activatedRoute: ActivatedRoute) {}

  ngOnInit() {
    this.state$ = this.activatedRoute.paramMap
      .pipe(map(() => window.history.state))
  }

늦었지만 이것이 최근 Angular를 가진 사람에게 도움이되기를 바랍니다.