Angular 2 - วิธีนำทางไปยังเส้นทางอื่นโดยใช้ this.router.parent.navigate ('/ about')


186

เชิงมุม 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('Mark@gmail.com', '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');

       });
   }
 }

นอกจากนี้ฉันได้ตั้งค่าการกำหนดเส้นทางในไฟล์ app.ts เช่น: @RouteConfig ([{path: '/', redirectTo: '/ home'}, {path: '/ home', คอมโพเนนต์: Todo : 'Home'}, {path: '/ about', component: About, as: 'About'}])
AngularM

คุณควรลบ/เส้นทางของคุณตามที่ไม่จำเป็นต้องใช้
mast3rd3mon

คำตอบ:


318

เส้นทางที่แน่นอน

การนำทางมี 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 }]

ไวยากรณ์เหมือนไดเรกทอรี

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

./ หรือไม่มีสแลชชั้นนำสัมพันธ์กับระดับปัจจุบัน

../ เพื่อเพิ่มระดับหนึ่งในเส้นทางเส้นทาง

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

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

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

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

จากเอกสารเราเตอร์เชิงมุมอย่างเป็นทางการ


3
รังเกียจคุณถ้าคุณมีเส้นทางเด็ก ๆ : { path: 'home', component: Home, children: homeRoutes }จากนั้นคุณต้องการที่จะให้วิธีการเราเตอร์: this.router.navigate(['home/address-search'])หรือthis.router.navigateByUrl(/'home/address-search')
แดเนียลราม

แม้นี่เป็นคำตอบที่ดีเป็นสิ่งสำคัญที่จะสังเกตเห็นว่า this.router= Router;อาจสร้างความสับสนให้ผู้อ่านบางคนในกรณีนี้คือการกล่าวถึงการฉีดพึ่งพาเราเตอร์ซึ่งฉันควรทำโดยใช้รหัสนี้แทน constructor( private router: Router )
siddharta

@Siddharta ขอบคุณสำหรับเคล็ดลับฉันไม่ได้สังเกตว่าจนกว่าคุณจะชี้ให้เห็น ฉันต้องเขียนตอนแรกอย่างรวดเร็วและตั้งใจจะอัปเดตในภายหลัง แต่ลืม ตัวอย่างได้รับการอัปเดตเพื่อใช้การฉีดที่ต้องพึ่งพาที่เหมาะสมในขณะนี้
TetraDev

@ TetraDev และ "this.route" มาจากไหน: D, เพิ่มไปยังการอ้างอิงของคุณ
Noob

33

คุณควรใช้

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

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

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

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

1
สวัสดีเมื่อฉันทำเช่นนั้นฉันได้รับข้อความแสดงข้อผิดพลาดนี้ในคอมไพเลอร์ typescript ของฉัน: "อาร์กิวเมนต์ของประเภท 'สตริง' ไม่สามารถกำหนดให้กับพารามิเตอร์ประเภทใด ๆ [], การผลักดันคุณสมบัติหายไปในประเภทสตริง"
AngularM

ฉันลองสิ่งนี้และมันใช้งานไม่ได้: this.router.parent.navigate ('[/ เกี่ยวกับ]');
AngularM

4
คุณควรใช้ไวยากรณ์นี้: this.router.parent.navigate (['/ เกี่ยวกับ']); คุณต้องผ่านอาร์เรย์ ['/ About'] ไม่ใช่ string '[/ About]'
Luca

สำหรับการใช้เราเตอร์ 3 รุ่นเบต้าthis._router.navigate(['/some-route']);
Adrian Moisa

27

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

พูดคำนิยามเราเตอร์เช่น:

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

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

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

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

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

นิยามเราเตอร์เช่น:

{path:'about', component: AboutComponent}

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

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

6
nameเลิกใช้กับประเภทเส้นทางใน Angular 2.0
RynoRn

ในเชิงมุม 2 จะถูกนำมาใช้แทน สำหรับรายละเอียดเพิ่มเติม -> angular.io/docs/ts/latest/guide/router.htmlv2.3.0dataname
WildDev

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

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

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

2

โดยส่วนตัวแล้วฉันพบว่าเนื่องจากเราเก็บngRoutesสะสม (เรื่องยาว) ฉันพบความเพลิดเพลินที่สุดจาก:

GOTO(ri) {
    this.router.navigate(this.ngRoutes[ri]);
}

จริง ๆ แล้วฉันใช้มันเป็นส่วนหนึ่งของคำถามสัมภาษณ์ของเรา ด้วยวิธีนี้ฉันสามารถอ่านได้ทันทีว่าใครเป็นผู้พัฒนาไปตลอดกาลโดยดูว่ามีใครกระตุกเมื่อพวกเขาพบGOTO(1)กับการเปลี่ยนเส้นทางโฮมเพจ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.