Không thể liên kết với 'routerLink' vì đây không phải là tài sản đã biết


145

Gần đây, tôi đã bắt đầu chơi với góc 2. Thật tuyệt vời cho đến nay. Vì vậy, tôi đã bắt đầu một dự án cá nhân demo cho mục đích học tập bằng cách sử dụng angular-cli.

Với thiết lập định tuyến cơ bản, bây giờ tôi muốn điều hướng đến một số tuyến từ tiêu đề, nhưng vì tiêu đề của tôi là cha mẹ đến router-outlet, tôi nhận được lỗi này.

app.component.html

<app-header></app-header> // Trying to navigate from this component
    <router-outlet></router-outlet>
<app-footer></app-footer>

header.component.html

  <a [routerLink]="['/signin']">Sign in</a>

Bây giờ tôi đã hiểu một phần tôi đoán rằng vì thành phần đó là một trình bao bọc xung quanh router-outletnên không thể truy cập theo cách này router. Vì vậy, có khả năng truy cập điều hướng từ bên ngoài cho một kịch bản như thế này?

Tôi sẽ rất vui khi thêm bất kỳ thông tin nào nếu cần. Cảm ơn bạn trước.

Cập nhật

1- My package.jsonđã có @angular/router 3.3.1phiên bản ổn định . 2- Trong appmô-đun chính của tôi , tôi đã nhập routing-module. Vui lòng xem bên dưới.

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { AlertModule  } from 'ng2-bootstrap';
import { LayoutModule } from './layout/layout.module';
import { UsersModule } from './users/users.module';
import { AppRoutingModule } from  './app-routing.module';
import { AppComponent } from './app.component';
import { PageNotFoundComponent } from './shared/components/not-found.component';

@NgModule({
  declarations: [
    AppComponent,
    PageNotFoundComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    AlertModule.forRoot(),
    LayoutModule,
    UsersModule,
    AppRoutingModule  --> This is the routing module. 
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

ứng dụng định tuyến.module.ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { SigninComponent } from './users/signin/signin.component';
import { PageNotFoundComponent } from './shared/components/not-found.component';

const routes: Routes = [
{ path: '**', component: PageNotFoundComponent }
];

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

export class AppRoutingModule {}

Con đường tôi đang cố gắng để truy cập được phân cấp từ khác moduleđó làUsersModule

user-định tuyến.module.ts

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { SigninComponent } from './signin/signin.component';

const usersRoutes: Routes = [
  { path: 'signin',  component: SigninComponent }
];
@NgModule({
  imports: [
    RouterModule.forChild(usersRoutes)
  ],
  exports: [
    RouterModule
  ]
})

export class UsersRoutingModule { }

Trong khi tôi đang cố gắng điều hướng từ một thành phần là một phần của Layoutmô-đun, nhưng không có khái niệm về mô-đun bộ định tuyến. Có phải đó là những gì gây ra lỗi.

Giao diện.module.ts

import { NgModule } from '@angular/core';
import { HeaderComponent } from './header/header.component';
import { FooterComponent } from './footer/footer.component';

@NgModule({
  declarations: [HeaderComponent, FooterComponent],
  exports: [HeaderComponent, FooterComponent]
})
export class LayoutModule{}

Tôi đang cố gắng điều hướng từ HeaderComponent. Tôi sẽ vui lòng cung cấp thêm thông tin nếu cần.


Nhập RouteModule vào thư mục gốc của ứng dụng của bạn và cập nhật gói
npm

Vâng, tôi có phiên bản ổn định mới nhất.
Umair Sarfraz

2
Bạn cũng đã thêm RouterModulevào imports: []tất cả các mô-đun nơi bạn sử dụng routerLinkhoặc<router-outlet>
Günter Zöchbauer

Đặt hàng mô-đun @Umair rất quan trọng trong nhập khẩu, di chuyển AppRoutingModuletrướcLayoutModule
harshes53

1
@ harshes53 Tôi không nghĩ đó là sự thật.
Günter Zöchbauer

Câu trả lời:


256

Bạn cần thêm RouterModulevào importsmọi @NgModule()nơi mà các thành phần sử dụng bất kỳ thành phần hoặc chỉ thị nào (trong trường hợp này routerLink<router-outlet>.

declarations: [] là để tạo ra các thành phần, chỉ thị, đường ống, được biết đến bên trong mô-đun hiện tại.

exports: []là để làm cho các thành phần, chỉ thị, đường ống, có sẵn để nhập mô-đun. Những gì được thêm vào declarationschỉ là riêng tư cho các mô-đun. exportslàm cho họ công khai.

Xem thêm https://angular.io/api/router/RouterModule#usage-notes


@Gunter có thể nhập RouterModule nhiều lần không? Ví dụ: nếu tôi muốn sử dụng routerLink trong childModule, tôi cần nhập RouterModule vào mô đun con trong khi nó đã được mô-đun ứng dụng gốc nhập vào ...
Olivier Boissé

Có, nó sẽ chỉ bao gồm một lần vào đầu ra xây dựng.
Günter Zöchbauer

Ok nhưng tôi nghĩ rằng chúng ta chỉ cần gọi phương thức forRootmột lần, các mô đun con chỉ nên nhập RouterModule mà không gọi phương thức forRoot
Olivier Boissé

Tôi nghĩ rằng nó phụ thuộc vào những gì forRootkhông. Khi ví dụ các nhà cung cấp với forRootnhiều lần, kết quả sẽ giống như nếu chỉ được thực hiện một lần. Nếu bạn làm những việc khác thì điều này có thể không khác.
Günter Zöchbauer

2
Cảm ơn câu trả lời này! Trong trường hợp của tôi, ứng dụng đã hoạt động, nhưng các thử nghiệm đã thất bại. Giải pháp là nhập RouterTestingModule trong các thử nghiệm, cho từng thành phần sử dụng routerLink.
Slasta Shynkarenko

24

Bạn đang thiếu hoặc bao gồm gói tuyến đường, hoặc bao gồm mô-đun bộ định tuyến trong mô-đun ứng dụng chính của bạn.

Hãy chắc chắn rằng gói.json của bạn có cái này:

"@angular/router": "^3.3.1"

Sau đó, trong app.module của bạn nhập bộ định tuyến và định cấu hình các tuyến đường:

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

imports: [
        RouterModule.forRoot([
            {path: '', component: DashboardComponent},
            {path: 'dashboard', component: DashboardComponent}
        ])
    ],

Cập nhật :

Di chuyển AppRoutingModule trở thành đầu tiên trong quá trình nhập:

imports: [
    AppRoutingModule.
    BrowserModule,
    FormsModule,
    HttpModule,
    AlertModule.forRoot(), // What is this?
    LayoutModule,
    UsersModule
  ],

Điều này đã không giải quyết vấn đề. Bạn có thể vui lòng kiểm tra cập nhật của tôi?
Umair Sarfraz

@Ben - "forRoot ()" có nghĩa là bạn đang gọi một phương thức được xác định trên một mô-đun đã nhập để chạy cấu hình hoặc thiết lập cho mô-đun. Bạn cũng có thể định nghĩa một phương thức như "forChild ()" trong một mô-đun tùy chỉnh và gọi nó, nếu bạn muốn. Phương pháp này được sử dụng cho các nhiệm vụ như thiết lập nhà cung cấp dịch vụ. Đó cũng là cách bạn có được một Dịch vụ Singleton ở Angular. Xem angular.io/guide/singleton-service
RoboBear 27/12/18

10

Tôi sẽ thêm một trường hợp khác khi tôi gặp lỗi tương tự nhưng chỉ là một hình nộm. Tôi đã thêm [routerLinkActiveOptions]="{exact: true}"mà không cần thêm routerLinkActive="active".

Mã không chính xác của tôi là

<a class="nav-link active" routerLink="/dashboard" [routerLinkActiveOptions]="{exact: true}">
  Home
</a>

khi nào nó nên

<a class="nav-link active" routerLink="/dashboard" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">
  Home
</a>

Không có routerLinkActive, bạn không thể có routerLinkActiveOptions.


3

Khi không có gì khác hoạt động khi nó hoạt động, khởi động lại phục vụ. Thật buồn khi tìm thấy loại bọ này.


2
Có thể phù hợp có một lỗi. Tôi chỉ tiếp tục xóa nội dung của thư mục dist và xây dựng lại. Cuối cùng nó đã làm việc. Hãy thử thêm một liên kết đến mọi thành phần trong app.component.ts. Nếu điều đó không hiệu quả, lựa chọn duy nhất của bạn là cầu nguyện và ăn chay.
Sam

1

Trong trường hợp của tôi, tôi chỉ cần nhập thành phần mới tạo của mình vào RouterModule

{path: 'newPath', component: newComponent}

Sau đó, trong quá trình app.modulenhập bộ định tuyến của bạn và định cấu hình các tuyến đường:

nhập {RouterModule} từ '@ angular / router';

imports: [
        RouterModule.forRoot([
            {path: '', component: DashboardComponent},
            {path: 'dashboard', component: DashboardComponent},
            {path: 'newPath', component: newComponent}
        ])
    ],

Hy vọng điều này sẽ giúp một số người !!!


1

Bạn cần thêm RouterMoudlevào importscác phần của mô-đun chứa Headerthành phần

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.