RouterLink không hoạt động


117

Định tuyến của tôi trong các ứng dụng angle2 hoạt động tốt. Nhưng tôi sẽ tạo một số routeLink dựa trên điều này :

Đây là định tuyến của tôi:

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

Và đây là các liên kết mà tôi đã thực hiện:

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

Tôi mong đợi rằng, khi tôi nhấp vào chúng, nó sẽ điều hướng đến thành phần được tôn trọng, nhưng chúng không thực hiện bất cứ điều gì?


Bạn có thể vui lòng thử [routerLink]='[/home']? Bạn đang sử dụng phiên bản Angular2 và phiên bản bộ định tuyến nào?
Günter Zöchbauer

nó không hoạt động. bạn có chắc chắn với nơi ở của bạn không ?? Tôi nghĩ rằng tôi đang sử dụng phiên bản cuối cùng của angle2, nhưng tôi không biết làm thế nào để kiểm tra nó. Tôi tạo ra nó với ng mới . và nó sẽ được cập nhật
Jeff

2
Xin lỗi, nên là[routerLink]="['/home']"
Günter Zöchbauer

2
Có thể bạn đã quên thêm directives: [ROUTER_DIRECTIVES],siêu dữ liệu của thành phần của mình. Nếu không có điều đó, Angular sẽ không biết phân tích cú pháp các routerLinks.
Mark Rajcok

Câu trả lời:


320

Mã bạn đang hiển thị ở đó là hoàn toàn chính xác.

Tôi nghi ngờ rằng vấn đề của bạn là bạn không nhập RouterModule (là nơi RouterLink được khai báo) vào mô-đun sử dụng mẫu này.

Tôi đã gặp sự cố tương tự và tôi đã mất một thời gian để giải quyết vì bước này không được đề cập trong tài liệu.

Vì vậy, hãy chuyển đến mô-đun khai báo thành phần với mẫu này và thêm:

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

sau đó thêm nó vào nhập mô-đun của bạn, ví dụ:

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

Cùng với việc có các câu lệnh nhập chính xác, bạn cũng sẽ cần một vị trí để hiển thị routerLink đó, nằm trong <router-outlet></router-outlet>phần tử, vì vậy nó cũng cần được đặt ở đâu đó trong đánh dấu HTML của bạn để bộ định tuyến biết vị trí hiển thị dữ liệu đó.


1
Tôi đã nghĩ như vậy và vâng - bạn cũng hoàn toàn đúng trong trường hợp của tôi!
Dhananjay

1
Thêm mô-đun Bộ định tuyến vào mục nhập của tôi đã thực hiện được mẹo, cảm ơn!
ENDEESA

1
Làm việc cho tôi. Cảm ơn rất nhiều!
TheBosti

20

đừng quên điều này để thêm điều này bên dưới trong mẫu của bạn:

<router-outlet></router-outlet>

9

Hãy thử thay đổi các liên kết như bên dưới:

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

Ngoài ra, hãy thêm phần sau vào tiêu đề của index.html:

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


5

sử dụng nó như thế này cho thông tin mroe đọc chủ đề này

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

7
Theo liên kết của bạn, anh ấy routerLinksẽ hoạt động ;-)
Günter Zöchbauer

Điều này hoạt động cho "@angular/router": "~3.4.0". Chúc mừng!
mikeym 27/12/16

2
Có, ký hiệu dấu ngoặc hoạt động (và là cú pháp hợp lệ với mục đích cụ thể), nhưng nó không phải là giải pháp cho câu hỏi này.
isherwood

1

Các liên kết sai, bạn phải thực hiện điều này:

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

Bạn có thể đọc hướng dẫn này


1
Ký hiệu dấu ngoặc nhọn phục vụ một mục đích khác và không giải quyết được vấn đề này.
isherwood

đây chính là nó! <a [routerLink]="['/home']" routerLinkActive="active"> Trang chủ </a> Tôi đang làm theo hướng dẫn đã đặt routerLinkActive trong thẻ <li>. khi tôi đặt nó trong thẻ <a, nó hiện hoạt động! Cảm ơn nhiều!!!! thật tuyệt vời!
Rich P

BTW, tôi đã có sẵn tất cả các thẻ / phần tử đề xuất khác. Bây giờ tính năng này hoạt động (đại loại là). Tôi phải làm theo phần còn lại của hướng dẫn vì tôi nhận thấy rằng khi tôi chọn các hàng khác, mặc dù giá trị cho hàng đã chọn đang được chuyển (tôi thấy nó trong url) chỉ có hàng đầu tiên được hiển thị. Nhưng đó sẽ là một chủ đề khác. Rất cám ơn một lần nữa vì sự giúp đỡ tuyệt vời này.
Rich P

Tôi không biết tại sao, nhưng khi tôi đặt Bracket, nó hoạt động với tôi và tôi không nhập RouterModule trong mô-đun ứng dụng của mình ..
Cegone

1

Tôi đang sử dụng routerlink thay vì routerLink .


Tôi đã mắc lỗi này và điều này đã sửa nó! Tôi cũng không biết tại sao bạn lại bị phản đối (có lẽ vì đây có thể là một nhận xét thay thế hoặc vì nó không trực tiếp trả lời câu hỏi cụ thể này?). Sẽ rất tốt nếu những người không tán thành nó có thể cung cấp lý do tại sao.
JoniVR

1

Tôi biết rằng câu hỏi này hiện đã khá cũ và rất có thể bạn đã sửa nó ngay bây giờ, nhưng tôi muốn đăng ở đây để tham khảo cho bất kỳ ai tìm thấy bài đăng này trong khi khắc phục sự cố này là điều này đã thắng sẽ không hoạt động nếu các thẻ Anchor của bạn nằm trong Index.html. Nó cần phải nằm trong một trong các thành phần


1

Đối với bất kỳ ai gặp lỗi này sau khi ghép các mô-đun kiểm tra các tuyến đường của bạn, điều sau đã xảy ra với tôi:

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

Di chuyển { path: '**', redirectTo: 'home' }đến AppRoutingModule của bạn:

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

Cũng có một trường hợp khác phù hợp với tình huống này. Nếu trong bộ chặn của bạn, bạn đã đặt nó trả về giá trị không phải Boolean, thì kết quả cuối cùng là như vậy.

Ví dụ, tôi đã cố gắng trả lại obj && obj[key]đồ đạc. Sau khi gỡ lỗi một lúc, sau đó tôi nhận ra mình phải chuyển đổi kiểu này sang kiểu Boolean theo cách thủ công Boolean(obj && obj[key])để cho phép nhấp chuột trôi qua.



1

Đối với đôi mắt không sắc sảo như của tôi, hrefthay vào đó routerLink, tôi đã tìm kiếm một vài lần để tìm ra #facepalm.

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.