ค้นหาเว็บไซต์

typescript - Angular 2 - ฉันจะไปยังเส้นทางอื่นโดยใช้ this.router.parent.navigate('/about') ได้อย่างไร?


Angular 2 - ฉันจะไปยังเส้นทางอื่นโดยใช้ this.router.parent.navigate('/about') ได้อย่างไร?

ดูเหมือนว่ามันจะใช้ไม่ได้ ฉันลอง location.go("/about"); เพราะมันไม่ทำงาน

โดยพื้นฐานแล้ว เมื่อผู้ใช้เข้าสู่ระบบแล้ว ฉันต้องการเปลี่ยนเส้นทางพวกเขาไปยังหน้าอื่น

นี่คือโค้ดของฉันด้านล่าง:

 import {Component} from 'angular2/angular2';
 import {CORE_DIRECTIVES, FORM_DIRECTIVES} from 'angular2/angular2';
 import {Router} from 'angular2/router';

 import {AuthService} from '../../authService';

 //Model
 class User {
   constructor(public email: string, public password: string) {}
 }

 @Component({
   templateUrl:'src/app/components/todo/todo.html',
   directives: [CORE_DIRECTIVES, FORM_DIRECTIVES]
 })

 export class Todo {   
     model = new User('[email ', 'Password'); 
     authService:AuthService;
     router: Router;

   constructor(_router: Router, _authService: AuthService){   
       this.authService = _authService;
       this.router = _router;
   }

   onLogin = () => {
       this.authService.logUserIn(this.model).then((success) => {      

          //This is where its broke - below:          
          this.router.parent.navigate('/about');

       });
   }
 }

คำตอบ #1

การกำหนดเส้นทางแบบเส้นทางตรง

มีวิธีการนำทาง 2 วิธี คือ .navigate() และ .navigateByUrl()

คุณสามารถใช้วิธี .navigateByUrl() สำหรับการทำเส้นทางแบบเส้นทางสมบูรณ์:

import {Router} from '@angular/router';

constructor(private router: Router) {}

navigateToLogin() {
   this.router.navigateByUrl('/login');
}

คุณใส่เส้นทางสมบูรณ์ไปยัง URL ของคอมโพเนนต์ที่คุณต้องการนำทางไป

หมายเหตุ: ให้ระบุเส้นทางสัมบูรณ์ทั้งหมดเสมอเมื่อเรียกใช้เมธอด navigateByUrl ของเราเตอร์ เส้นทางสัมบูรณ์ต้องเริ่มต้นด้วย /

// Absolute route - Goes up to root level    
this.router.navigate(['/root/child/child']);

// Absolute route - Goes up to root level with route params   
this.router.navigate(['/root/child', crisis.id]);

การเส้นทางแบบเส้นทางสัมพันธ์

ถ้าคุณต้องการใช้การกำหนดเส้นทางแบบเส้นทางสัมพันธ์ ให้ใช้วิธี .navigate()

หมายเหตุ: วิธีการทำงานของการกำหนดเส้นทางค่อนข้างไม่ตรงไปตรงมา โดยเฉพาะเส้นทางของพ่อแม่ พี่น้อง และลูก:

// Parent route - Goes up one level 
// (notice the how it seems like you're going up 2 levels)
this.router.navigate(['../../parent'], { relativeTo: this.route });

// Sibling route - Stays at the current level and moves laterally, 
// (looks like up to parent then down to sibling)
this.router.navigate(['../sibling'], { relativeTo: this.route });

// Child route - Moves down one level
this.router.navigate(['./child'], { relativeTo: this.route });

// Moves laterally, and also add route parameters
// if you are at the root and crisis.id = 15, will result in '/sibling/15'
this.router.navigate(['../sibling', crisis.id], { relativeTo: this.route });

// Moves laterally, and also add multiple route parameters
// will result in '/sibling;id=15;foo=foo'. 
// Note: this does not produce query string URL notation with ? and & ... instead it
// produces a matrix URL notation, an alternative way to pass parameters in a URL.
this.router.navigate(['../sibling', { id: crisis.id, foo: 'foo' }], { relativeTo: this.route });

หรือถ้าคุณเพียงแค่ต้องการนำทางภายในเส้นทางปัจจุบัน แต่ไปยังพารามิเตอร์เส้นทางที่ต่างกัน:

// If crisis.id has a value of '15'
// This will take you from `/hero` to `/hero/15`
this.router.navigate([crisis.id], { relativeTo: this.route });

อาร์เรย์พารามิเตอร์ลิงก์

อาร์เรย์พารามิเตอร์ลิงก์จะเก็บส่วนประกอบต่อไปนี้สำหรับการนำทางเราท์เตอร์:

  • เส้นทางของรูทไปยังคอมโพเนนต์ปลายทาง ['/hero']
  • พารามิเตอร์เส้นทางที่จำเป็นและไม่บังคับที่ใส่เข้าไปใน URL ของเส้นทาง ['/hero', hero.id] หรือ ['/hero', { id: hero.id, foo: baa }]

ไวยากรณ์แบบไดเรกทอรี

เราเตอร์รองรับไวยากรณ์แบบเหมือนไดเรกทอรีในรายการพารามิเตอร์ลิงก์เพื่อช่วยชี้แนวทางการค้นหาชื่อเส้นทาง:

./ หรือไม่มีเครื่องหมายทับนำ หมายถึงสัมพันธ์กับระดับปัจจุบัน

../ เพื่อขึ้นไปหนึ่งระดับในเส้นทางของ route.

คุณสามารถรวมไวยากรณ์การนำทางเชิงสัมพันธ์เข้ากับเส้นทางของบรรพบุรุษได้ หากคุณจำเป็นต้องนำทางไปยังเส้นทางพี่น้อง คุณสามารถใช้รูปแบบ ../<sibling> เพื่อขึ้นไปหนึ่งระดับ จากนั้นไปทางด้านข้างและลงเส้นทางของพี่น้อง

หมายเหตุสำคัญเกี่ยวกับการนำทางแบบสัมพัทธ์

ในการนำทางเส้นทางสัมพัทธ์ด้วยวิธี Router.navigate คุณต้องระบุ ActivatedRoute เพื่อให้ตัว router รับรู้ว่าคุณอยู่ที่ใดในต้นไม้เส้นทางปัจจุบัน

หลังจากอาร์เรย์พารามิเตอร์ลิงก์ ให้เพิ่มอ็อบเจ็กต์ที่มีคุณสมบัติ relativeTo ตั้งค่าเป็น ActivatedRoute จากนั้นตัว router จะคำนวณ URL เป้าหมายตามตำแหน่งของเส้นทางที่ถูกใช้งานอยู่

จากเอกสารอย่างเป็นทางการของ Angular Router

คำตอบ #2

คุณควรใช้

this.router.parent.navigate(['/About']);

นอกจากการระบุเส้นทางแล้ว คุณยังสามารถระบุชื่อของเส้นทางของคุณได้ด้วย:

{ path:'/About', name: 'About',   ... }

this.router.parent.navigate(['About']);

คำตอบ #3

สามารถใช้ได้โดยไม่ต้องมี parent ด้วย

พูดคำนิยามของเราเตอร์แบบ:

{path:'/about',    name: 'About',   component: AboutComponent}

จากนั้นสามารถนำทางโดยใช้ name แทน path

goToAboutPage() {
    this.router.navigate(['About']); // here "About" is name not path
}

อัปเดตสำหรับ V2.3.0

ในการ Routing จาก v2.0 คุณสมบัติ name ไม่สามารถใช้งานได้อีกต่อไป การกำหนด route จะทำโดยไม่มีคุณสมบัติ name ดังนั้นคุณควรใช้ path แทน name this.router.navigate(['/path']) และ ไม่ต้องมี slash นำหน้า สำหรับ path ดังนั้นให้ใช้ path: 'about' แทน path: '/about'

คำจำกัดความของเราเตอร์เหมือน:

{path:'about', component: AboutComponent}

จากนั้นสามารถนำทางโดยใช้ path

goToAboutPage() {
    this.router.navigate(['/about']); // here "About" is path
}

คำตอบ #4

import { Router } from '@angular/router';
//in your constructor
constructor(public router: Router){}

//navigation 
link.this.router.navigateByUrl('/home');

บทความที่เกี่ยวข้อง