RouterLink ไม่ทำงาน


118

การกำหนดเส้นทางของฉันในแอพ angular2 ทำงานได้ดี แต่ฉันจะสร้าง routeLink ตามนี้ :

นี่คือเส้นทางของฉัน:

const routes: RouterConfig = [
    { path:'home' , component: FormComponent  },
    { path:'about', component: AboutComponent },
    { path:'**'   , component: FormComponent  }
];

และนี่คือลิงค์ที่ฉันทำ:

<ul class="nav navbar-nav item">
                    <li>
                        <a routerLink='/home' routerLinkActive="active">Home</a>
                    </li>
                    <li>
                        <a routerLink='/about' routerLinkActive="active">About this</a>
                    </li>
</ul>

ฉันคาดหวังว่าเมื่อฉันคลิกที่พวกเขามันจะไปยังองค์ประกอบที่เคารพ แต่พวกเขาไม่ได้ทำอะไรเลย?


คุณช่วยลองหน่อยได้[routerLink]='[/home']ไหม คุณใช้ Angular2 เวอร์ชันใดและเราเตอร์เวอร์ชันใด
GünterZöchbauer

มันไม่ทำงาน คุณแน่ใจกับสถานที่ของ qutations ของคุณหรือไม่? ฉันคิดว่าฉันกำลังใช้ angular2 เวอร์ชันสุดท้าย แต่ฉันไม่รู้วิธีตรวจสอบ ฉันสร้างมันด้วยng ใหม่ และควรอัปเดต
Jeff

2
ขออภัยควรจะเป็น[routerLink]="['/home']"
GünterZöchbauer

2
บางทีคุณอาจลืมเพิ่มdirectives: [ROUTER_DIRECTIVES],ข้อมูลเมตาของส่วนประกอบของคุณ หากไม่มีสิ่งนั้น Angular จะไม่รู้ว่าจะแยกวิเคราะห์routerLinks
Mark Rajcok

คำตอบ:


323

รหัสที่คุณแสดงนั้นถูกต้อง

ฉันสงสัยว่าปัญหาของคุณคือคุณไม่ได้นำเข้า RouterModule (ซึ่งเป็นที่ประกาศ RouterLink) ลงในโมดูลที่ใช้เทมเพลตนี้

ฉันมีปัญหาที่คล้ายกันและต้องใช้เวลาพอสมควรในการแก้ไขเนื่องจากขั้นตอนนี้ไม่ได้ระบุไว้ในเอกสารประกอบ

ไปที่โมดูลที่ประกาศคอมโพเนนต์ด้วยเทมเพลตนี้และเพิ่ม:

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

จากนั้นเพิ่มลงในการนำเข้าโมดูลของคุณเช่น

@NgModule({
  imports: [
    CommonModule,
    RouterModule
  ],
  declarations: [MyTemplatesComponent]
})
export class MyTemplatesModule { }

นอกเหนือจากการมีคำสั่งการนำเข้าที่ถูกต้องแล้วคุณยังต้องมีที่สำหรับแสดง routerLink ซึ่งอยู่ใน<router-outlet></router-outlet>องค์ประกอบดังนั้นจึงต้องวางไว้ที่ใดที่หนึ่งในมาร์กอัป HTML ของคุณเพื่อให้เราเตอร์รู้ว่าจะแสดงข้อมูลนั้นที่ใด


1
ฉันคิดอย่างนั้นและใช่ - คุณก็พูดถูกในกรณีของฉันเช่นกัน!
Dhananjay

1
การเพิ่มโมดูลเราเตอร์ในการนำเข้าของฉันได้เคล็ดลับขอบคุณ!
ENDEESA

1
ใช้ได้ผลสำหรับฉัน ขอบคุณมาก!
TheBosti

21

อย่าลืมสิ่งนี้เพื่อเพิ่มสิ่งนี้ด้านล่างในเทมเพลตของคุณ:

<router-outlet></router-outlet>

สิ่งนี้ได้ผลสำหรับฉัน ขอบคุณ
Vishwas Tyagi

10

ลองเปลี่ยนลิงค์ด้านล่าง:

  <ul class="nav navbar-nav item">
    <li>
        <a [routerLink]="['/home']" routerLinkActive="active">Home</a>
    </li>
    <li>
        <a [routerLink]="['/about']" routerLinkActive="active">About this</a>
    </li>
  </ul>

นอกจากนี้ให้เพิ่มสิ่งต่อไปนี้ในส่วนหัวของ index.html:

<base href="https://stackoverflow.com/">


6

ใช้เช่นนี้สำหรับข้อมูล mroe อ่านหัวข้อนี้

<a [routerLink]="['/about']">About this</a>

7
ตามลิงค์ของคุณเขาrouterLinkควรจะทำงาน ;-)
GünterZöchbauer

สิ่งนี้ใช้ได้กับ"@angular/router": "~3.4.0". ไชโย!
mikeym

2
ใช่เครื่องหมายวงเล็บใช้งานได้ (และเป็นไวยากรณ์ที่ถูกต้องตามวัตถุประสงค์เฉพาะ) แต่ไม่ใช่วิธีแก้ปัญหาสำหรับคำถามนี้
isherwood

3

ฉันทราบดีว่าคำถามนี้ค่อนข้างเก่าแล้วในตอนนี้และคุณน่าจะแก้ไขได้แล้วในตอนนี้ แต่ฉันต้องการโพสต์ที่นี่เพื่อเป็นข้อมูลอ้างอิงสำหรับทุกคนที่พบโพสต์นี้ในขณะที่แก้ไขปัญหานี้ก็คือสิ่งนี้ชนะ จะใช้ไม่ได้หากแท็ก Anchor ของคุณอยู่ใน Index.html จำเป็นต้องอยู่ในส่วนประกอบอย่างใดอย่างหนึ่ง


2

ลิงก์ไม่ถูกต้องคุณต้องทำสิ่งนี้:

<ul class="nav navbar-nav item">
    <li>
        <a [routerLink]="['/home']" routerLinkActive="active">Home</a>
    </li>
    <li>
        <a [routerLink]="['/about']" routerLinkActive="active">About this
        </a>
    </li>
</ul>

คุณสามารถอ่านบทแนะนำนี้


1
สัญลักษณ์วงเล็บมีจุดประสงค์ที่แตกต่างกันและไม่สามารถแก้ปัญหานี้ได้
isherwood

นี่มัน! <a [routerLink]="['/home']" routerLinkActive="active"> หน้าแรก </a> ฉันทำตามบทช่วยสอนซึ่งให้ฉันใส่ routerLinkActive ในแท็ก <li> เมื่อฉันวางไว้ในแท็ก <a มันใช้งานได้แล้ว! ขอบคุณมาก!!!! ยอดเยี่ยมมาก!
Rich P

BTW ฉันมีแท็ก / องค์ประกอบที่แนะนำอื่น ๆ ทั้งหมดอยู่แล้ว ตอนนี้คุณสมบัตินี้ใช้งานได้ (เรียงลำดับ) ฉันต้องทำตามส่วนที่เหลือของบทช่วยสอนเพราะฉันสังเกตเห็นว่าเมื่อฉันเลือกแถวอื่นแม้ว่าจะมีการส่งค่าสำหรับแถวที่เลือก (ฉันเห็นใน URL) จะแสดงเฉพาะแถวแรกเท่านั้น แต่นั่นจะเป็นอีกหัวข้อหนึ่ง ขอขอบคุณอีกครั้งสำหรับความช่วยเหลือที่ดีนี้
Rich P

ฉันไม่รู้ว่าทำไม แต่เมื่อฉันใส่ Bracket มันใช้ได้สำหรับฉันและฉันไม่ได้นำเข้า RouterModule ในโมดูลแอพของฉัน ..
Cegone

2

สำหรับใครก็ตามที่มีข้อผิดพลาดนี้หลังจากแยกโมดูลตรวจสอบเส้นทางของคุณสิ่งต่อไปนี้เกิดขึ้นกับฉัน:

public-Routing.module.ts:

const routes: Routes = [
    { path: '', component: HomeComponent },
    { path: '**', redirectTo: 'home' } // ← This was my mistake
    { path: 'home', component: HomeComponent },
    { path: 'privacy-policy', component: PrivacyPolicyComponent },
    { path: 'credits', component: CreditsComponent },
    { path: 'contact', component: ContactComponent },
    { path: 'news', component: NewsComponent },
    { path: 'presentation', component: PresentationComponent }
]

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class PublicRoutingModule { }

app-Routing.module.ts:

const routes: Routes = [
];

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class AppRoutingModule { }

ย้าย{ path: '**', redirectTo: 'home' }ไปที่ AppRoutingModule ของคุณ:

public-Routing.module.ts:

const routes: Routes = [
    { path: '', component: HomeComponent },
    { path: 'home', component: HomeComponent },
    { path: 'privacy-policy', component: PrivacyPolicyComponent },
    { path: 'credits', component: CreditsComponent },
    { path: 'contact', component: ContactComponent },
    { path: 'news', component: NewsComponent },
    { path: 'presentation', component: PresentationComponent }
]

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class PublicRoutingModule { }

app-Routing.module.ts:

const routes: Routes = [
    { path: '**', redirectTo: 'home' }
];

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class AppRoutingModule { }

1

ผมใช้ routerlink แทนrouterLink


ฉันทำผิดพลาดและสิ่งนี้ได้รับการแก้ไขแล้ว! ฉันไม่รู้เหมือนกันว่าทำไมคุณถึงถูกลดคะแนน (อาจเป็นเพราะอาจเป็นความคิดเห็นแทนหรือเพราะไม่ได้ตอบคำถามเฉพาะนี้โดยตรง?) คงจะดีไม่น้อยหากผู้ที่ลงคะแนนสามารถให้เหตุผลว่าทำไม
JoniVR

1

นอกจากนี้ยังมีอีกกรณีหนึ่งที่เหมาะสมกับสถานการณ์นี้ หากใน interceptor ของคุณคุณทำให้มันส่งคืนค่าที่ไม่ใช่บูลีนผลลัพธ์สุดท้ายก็เป็นเช่นนั้น

ตัวอย่างเช่นฉันพยายามจะคืนobj && obj[key]ของ หลังจากดีบั๊กสักพักแล้วฉันก็รู้ว่าฉันต้องแปลงสิ่งนี้เป็นประเภทบูลีนด้วยตนเองBoolean(obj && obj[key])เพื่อให้การคลิกผ่านไป



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