Gửi dữ liệu qua các đường dẫn định tuyến trong Angular


181

Có cách nào để gửi dữ liệu dưới dạng tham số với router.navigate không? Ý tôi là, một cái gì đó giống như ví dụ này , như bạn có thể thấy tuyến đường có tham số dữ liệu, nhưng thực hiện điều này không hoạt động:

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

bởi vì một số dữ liệu không phải là một tham số hợp lệ. Làm thế nào tôi có thể làm điều đó? Tôi không muốn gửi tham số với queryParams.


Tôi nghĩ nó phải theo cách khác như trong AngularJS, nơi chúng tôi có thể làm một cái gì đó như $ state.go ('anh hùng', {some-data: "otherData"})
Motomine

3 cách đơn giản để chia sẻ dữ liệu qua các tuyến đường - angulartutorial.net/2017/12/ từ
Prashobh

Sử dụng cách tiếp cận của tôi npmjs.com/package/ngx-navlation-with-data bình luận cuối cùng của tôi, tốt nhất cho mọi người
Virendra Yadav

Câu trả lời:


511

Có rất nhiều nhầm lẫn về chủ đề này bởi vì có rất nhiều cách khác nhau để làm điều đó.

Dưới đây là các loại thích hợp được sử dụng trong các ảnh chụp màn hình sau:

private route: ActivatedRoute
private router: Router

1) Các thông số định tuyến cần thiết:

nhập mô tả hình ảnh ở đây

2) Thông số tùy chọn tuyến đường:

nhập mô tả hình ảnh ở đây

3) Tham số truy vấn tuyến:

nhập mô tả hình ảnh ở đây

4) Bạn có thể sử dụng một dịch vụ để truyền dữ liệu từ thành phần này sang thành phần khác mà không cần sử dụng tham số tuyến đường.

Ví dụ, xem: https://bloss.msmvps.com/deborahk/build-a-simple-angular-service-to-share-data/

Tôi có một plunker về điều này ở đây: https://plnkr.co/edit/KT4JLmpcwGBM2xdZQeI9?p=preview


Cảm ơn bạn vì câu trả lời! Sự khác biệt giữa 2) và 3) là gì? Bởi vì cả hai cuối cùng đều thêm "? Tham số =" trong URL. Bạn có thể cho tôi một ví dụ cho 4)? Tôi không thể tìm ra cách để làm điều đó.
Motomine

Tôi đã cập nhật bằng câu trả lời để hiển thị các URL khác nhau và để cung cấp liên kết đến bài đăng trên blog và trình bày về cách truyền dữ liệu với một dịch vụ. URL khác với các tham số tùy chọn và truy vấn như được hiển thị ở trên. Tham số truy vấn cộng có thể được giữ lại trên các tuyến đường.
DeborahK

5
Tôi cũng có một khóa học Pluralsight về định tuyến bao gồm tất cả những điều này: app.pluralsight.com/l Library / cifts / angular-routing / Lỗi Bạn có thể đăng ký một tuần miễn phí nếu bạn muốn biết thêm thông tin.
DeborahK

3
Dữ liệu chỉ được "chia sẻ" trong ứng dụng thực thi. Nếu người dùng làm mới trang, toàn bộ ứng dụng sẽ được tải lại từ máy chủ, do đó không có trạng thái trước nào được giữ lại trong ứng dụng. Suy nghĩ về nó theo một ứng dụng thông thường, khi người dùng làm mới nó giống như đóng và mở lại ứng dụng. Nếu bạn cần giữ lại trạng thái sau khi làm mới, thì bạn sẽ cần lưu trữ nó ở một nơi nào đó như bộ nhớ cục bộ hoặc trên máy chủ.
DeborahK

2
Chỉ cần một gợi ý nhỏ: routeloại là ActivatedRoute, không Router.
Asen Khachaturyan

156

Có một phương pháp mới đi kèm với Angular 7.2.0

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

Gửi:

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

Nhận:

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

Bạn có thể ngón tay một số thông tin bổ sung ở đây:

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

Liên kết ở trên chứa ví dụ này, những gì có thể hữu ích: https://stackblitz.com/edit/angular-bupuzn


11
Đây là câu trả lời đúng cho các tính năng mới trong Angular 7.
Randy

2
Với phương pháp này, tôi sẽ xử lý việc làm mới trình duyệt của người dùng như thế nào? Trong trường hợp đó, dữ liệu trong phần bổ sung điều hướng dường như biến mất, do đó không có cơ hội sử dụng lại khi làm mới.
tobi_b

1
@tobi_b Tôi nghĩ bạn đúng, sau khi làm mới bạn không thể tiếp cận được. Nếu bạn cần nó sau khi làm mới, các phương pháp trong câu trả lời được chấp nhận sẽ tốt hơn.
Véger Lóránd

3
Đúng đó là lý do tại sao bạn chỉ có thể lấy dữ liệu từ this.router.getCienNavestion () trong hàm tạo. Nếu bạn cần nó ở nơi khác như bên trong ngOnInit (), bạn có thể truy cập vào máng dữ liệu "history.state". Từ tài liệu: "Trạng thái được chuyển đến bất kỳ điều hướng nào. Giá trị này sẽ có thể truy cập được thông qua đối tượng bổ sung được trả về từ bộ định tuyến.getCienNavestion () trong khi điều hướng đang thực thi. Khi điều hướng hoàn thành, giá trị này sẽ được ghi vào history.state khi vị trí Phương thức .go hoặc location.replaceState được gọi trước khi kích hoạt tuyến đường này. "
Véger Lóránd

8
Ngoài ra hãy chắc chắn rằng bạn không nên cố gắng để nhận được một đối tượng tính năng bổ sung trong ngOnInit()khithis.router.getCurrentNavigation().extras
hastrb

26

Phiên bản mới nhất của angular (7.2 +) hiện có tùy chọn truyền thông tin bổ sung bằng NavigationExtras .

Thành phần nhà

import {
  Router,
  NavigationExtras
} from '@angular/router';
const navigationExtras: NavigationExtras = {
  state: {
    transd: 'TRANS001',
    workQueue: false,
    services: 10,
    code: '003'
  }
};
this.router.navigate(['newComponent'], navigationExtras);

thành phần mới

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

Đầu ra

nhập mô tả hình ảnh ở đây

Hy vọng điều này sẽ giúp!


1

@ dev-nish Mã của bạn hoạt động với một vài điều chỉnh trong đó. làm cái

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

vào

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

sau đó, nếu bạn muốn gửi một loại dữ liệu cụ thể, ví dụ, JSON là kết quả của việc điền vào biểu mẫu, bạn có thể gửi dữ liệu theo cách tương tự như được giải thích trước đây.


0

Trong navigationExtra, chúng ta chỉ có thể chuyển một số tên cụ thể làm đối số nếu không nó hiển thị lỗi như dưới đây: Đối với Ex- Ở đây tôi muốn chuyển khóa khách hàng trong điều hướng bộ định tuyến và tôi chuyển như thế này-

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

nhưng nó hiển thị một số lỗi như dưới đây:

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'

.

Giải pháp: chúng ta phải viết như thế này:

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

-2

Tốt nhất tôi tìm thấy trên internet cho điều này là ngx-navigation-with-data . Nó rất đơn giản và tốt để điều hướng dữ liệu từ thành phần này sang thành phần khác. Bạn chỉ cần nhập lớp thành phần và sử dụng nó theo cách rất đơn giản. Giả sử bạn có nhà và về thành phần và muốn gửi dữ liệu sau đó

THÀNH PHẦN

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

}

GIỚI THIỆU

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

}

Đối với bất kỳ truy vấn nào, hãy theo dõi https://www.npmjs.com/package/ngx-navlation-with-data

Bình luận xuống để được giúp đỡ.


Nó chuyển dữ liệu dưới dạng params hay chỉ trong nền?
Marium Malik

Tôi không thể hiểu @MariumMalik Bạn có thể hỏi một cách mô tả không?
Virendra Yadav

Có, nó có @MariumMalik
Virendra Yadav

3
Bạn dường như là tác giả của điều này, chứ không phải là "Tôi tìm thấy trên internet"? Bạn cũng được yêu cầu không spam nó trên chuỗi Angular 7 thực hiện chức năng tương tự ( github.com/angular/angular/pull/27198 )
IrishDubGuy 28/03/19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.