ส่งข้อมูลผ่านเส้นทางการกำหนดเส้นทางในเชิงมุม


182

อย่างไรก็ตามมีการส่งข้อมูลเป็นพารามิเตอร์ด้วย router.navigate หรือไม่ ฉันหมายถึงตัวอย่างเช่นนี้คุณสามารถเห็นเส้นทางมีพารามิเตอร์ข้อมูล แต่การทำเช่นนี้มันไม่ทำงาน:

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

เพราะข้อมูลบางอย่างไม่ใช่พารามิเตอร์ที่ถูกต้อง ฉันจะทำสิ่งนั้นได้อย่างไร ฉันไม่ต้องการส่งพารามิเตอร์ด้วย queryParams


ฉันคิดว่ามันควรจะเป็นแบบอื่นใน AngularJS ซึ่งเราสามารถทำบางสิ่งเช่น $ state.go ('heroes', {some-data: "otherData"})
Motomine

3 วิธีง่ายๆในการแบ่งปันข้อมูลผ่านเส้นทาง - angulartutorial.net/2017/12/…
Prashobh

ใช้วิธีการของฉันnpmjs.com/package/ngx-navigation-with-dataความคิดเห็นล่าสุดโดยฉันดีที่สุดสำหรับทุกคน
Virendra Yadav

คำตอบ:


515

มีความสับสนมากมายในหัวข้อนี้เพราะมีหลายวิธีที่จะทำ

นี่คือประเภทที่เหมาะสมที่ใช้ในภาพหน้าจอต่อไปนี้:

private route: ActivatedRoute
private router: Router

1) พารามิเตอร์การกำหนดเส้นทางที่จำเป็น:

ป้อนคำอธิบายรูปภาพที่นี่

2) พารามิเตอร์ทางเลือกเส้นทาง:

ป้อนคำอธิบายรูปภาพที่นี่

3) พารามิเตอร์การค้นหาเส้นทาง:

ป้อนคำอธิบายรูปภาพที่นี่

4) คุณสามารถใช้บริการเพื่อส่งผ่านข้อมูลจากส่วนประกอบหนึ่งไปยังอีกองค์ประกอบหนึ่งโดยไม่ต้องใช้พารามิเตอร์เส้นทางเลย

ดูตัวอย่างได้ที่: https://blogs.msmvps.com/deborahk/build-a-simple-angular-service-to-share-data/

ฉันมีเรื่องเล่าลือที่นี่: https://plnkr.co/edit/KT4JLmpcwGBM2xdZQeI9?p=preview


ขอบคุณสำหรับคำตอบ! ความแตกต่างระหว่าง 2) และ 3) คืออะไร? เพราะทั้งคู่จบการเพิ่ม "? พารามิเตอร์ =" ใน URL คุณสามารถยกตัวอย่างสำหรับ 4) ให้ฉันได้ไหม ฉันไม่สามารถหาวิธีที่จะทำ
Motomine

ฉันอัปเดตโดยคำตอบเพื่อแสดง URL ที่แตกต่างกันและเพื่อให้ลิงก์ไปยังโพสต์บล็อกและผู้พูดพล่อยเกี่ยวกับวิธีส่งผ่านข้อมูลด้วยบริการ URL แตกต่างกับพารามิเตอร์ทางเลือกและพารามิเตอร์การค้นหาตามที่แสดงด้านบน บวกพารามิเตอร์การสืบค้นสามารถรักษาข้ามเส้นทาง
DeborahK

6
ฉันยังมีหลักสูตร Pluralsight เกี่ยวกับการกำหนดเส้นทางที่ครอบคลุมทั้งหมดนี้: app.pluralsight.com/library/courses/angular-routing/คุณสามารถสมัครสัปดาห์ฟรีหากคุณสนใจข้อมูลเพิ่มเติม
DeborahK

3
ข้อมูลเป็น "แชร์" เท่านั้นภายในแอปพลิเคชันที่ดำเนินการ หากผู้ใช้รีเฟรชหน้าแอปพลิเคชันทั้งหมดจะถูกโหลดซ้ำจากเซิร์ฟเวอร์ดังนั้นจะไม่มีการเก็บสถานะไว้ก่อนในแอปพลิเคชัน คิดถึงมันในแง่ของแอปพลิเคชันทั่วไปเมื่อผู้ใช้รีเฟรชมันก็เหมือนการปิดและเปิดแอปพลิเคชันอีกครั้ง หากคุณต้องการคงสถานะไว้หลังจากรีเฟรชคุณจะต้องเก็บไว้ที่ใดที่หนึ่งเช่นที่เก็บข้อมูลในเครื่องหรือบนเซิร์ฟเวอร์
DeborahK

2
เพียงคำแนะนำเล็ก ๆ : routeประเภทคือ ไม่ActivatedRoute 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égerLóránd

3
ใช่นั่นคือเหตุผลที่คุณจะได้รับข้อมูลจาก this.router.getCurrentNavigation () ในตัวสร้าง หากคุณต้องการที่อื่นเช่นภายใน ngOnInit () คุณสามารถเข้าถึงข้อมูล "history.state" รางราง จากเอกสารประกอบ: "สถานะผ่านไปยังการนำทางใด ๆ ค่านี้จะสามารถเข้าถึงได้ผ่านวัตถุพิเศษที่ส่งคืนจาก router.getCurrentNavigation () ในขณะที่การนำทางกำลังดำเนินการอยู่เมื่อการนำทางเสร็จสมบูรณ์ค่านี้จะถูกเขียนลงในประวัติ .go หรือวิธี location.replaceState ถูกเรียกก่อนเปิดใช้งานเส้นทางนี้ "
VégerLó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

ใน navigationExtra เราสามารถส่งเฉพาะบางชื่อเป็นอาร์กิวเมนต์มิฉะนั้นจะแสดงข้อผิดพลาดเช่นด้านล่าง: สำหรับอดีต - ที่นี่ฉันต้องการส่งรหัสลูกค้าในการนำทางเราเตอร์และฉันผ่านเช่นนี้ -

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 นำทางที่มีข้อมูล มันง่ายมากและดีสำหรับการนำทางข้อมูลจากส่วนประกอบหนึ่งไปยังอีกองค์ประกอบหนึ่ง คุณต้องนำเข้าส่วนประกอบคลาสและใช้งานในวิธีที่ง่ายมาก สมมติว่าคุณมีบ้านและส่วนประกอบและต้องการส่งข้อมูล

ส่วนประกอบบ้าน

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 Yadav

3
คุณดูเหมือนจะเป็นผู้เขียนสิ่งนี้มากกว่า "ฉันพบทางอินเทอร์เน็ต" หรือไม่? คุณจะถูกถามว่าจะไม่สแปมในเธรด Angular 7 ที่ใช้ฟังก์ชันการทำงานที่คล้ายกัน ( github.com/angular/angular/pull/27198 )
IrishDubGuy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.