【问题标题】:Can't bind to 'routerLink' since it isn't a known property无法绑定到“routerLink”,因为它不是已知属性
【发布时间】:2017-06-21 11:34:42
【问题描述】:

最近,我开始玩 angular 2。到目前为止,它很棒。所以,为了学习使用angular-cli,我开始了一个演示个人项目。

通过基本路由设置,我现在想从标头导航到一些路由,但由于我的标头是 router-outlet 的父级,我收到此错误。

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>

现在我部分理解了,我猜想由于该组件是router-outlet 的包装器,因此无法通过这种方式访问​​router。那么,对于这样的场景,是否有可能从外部访问导航?

如果需要,我很乐意添加更多信息。提前谢谢你。

更新

1- 我的package.json 已经有稳定的@angular/router 3.3.1 版本。 2- 在我的主要app 模块中,我导入了routing-module。请看下文。

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

app-routing.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 {}

我试图访问的路由是从另一个module 委托的,即UsersModule

user-routing.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 { }

虽然我试图从属于Layout 模块的组件导航,但没有路由器模块的概念。这是导致错误的原因吗?

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

我正在尝试从HeaderComponent 导航。如果需要,我很乐意提供更多信息。

【问题讨论】:

  • 在应用根目录导入RouteModule,并更新npm包最新稳定版
  • 是的,我有最新的稳定版本。
  • 您是否也将RouterModule 添加到您使用routerLink&lt;router-outlet&gt; 的所有模块的imports: []
  • @Umair 模块顺序在导入中很重要,将 AppRoutingModule 移到 LayoutModule 之前
  • @harshes53 我不认为这是真的。

标签: angular typescript angular2-routing


【解决方案1】:

您需要将RouterModule 添加到每个@NgModule()imports,其中组件使用来自的任何组件或指令(在本例中为routerLink&lt;router-outlet&gt;

import {RouterModule} from '@angular/router';
@NgModule({
   declarations:[YourComponents],
   imports:[RouterModule]

declarations: [] 是让组件、指令、管道,在当前模块中是已知的。

exports: [] 使组件、指令、管道可用于导入模块。仅添加到 declarations 的内容对模块来说是私有的。 exports 将它们公开。

另见https://angular.io/api/router/RouterModule#usage-notes

【讨论】:

  • @Gunter 可以多次导入 RouterModule 吗?例如,如果我想在 childModule 中使用 routerLink,我需要将 RouterModule 导入子模块,而它已经被根应用程序模块导入...
  • 是的,它只会在构建输出中包含一次。
  • 好的,但我认为我们需要注意只调用一次方法forRoot,子模块应该只导入RouterModule而不调用forRoot方法
  • 我认为这取决于forRoot 的作用。多次使用forRoot 注册提供者时,结果与只注册一次相同。如果你做其他事情,这可能不会有所不同。
  • 感谢您的回答!就我而言,该应用程序有效,但测试失败。解决方案是在测试中为每个使用 routerLink 的组件导入 RouterTestingModule。
【解决方案2】:

您缺少包含路由包,或在您的主应用模块中包含路由器模块。

确保你的 package.json 有这个:

"@angular/router": "^3.3.1"

然后在你的 app.module 中导入路由器并配置路由:

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

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

更新

将 AppRoutingModule 移到导入的首位:

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

【讨论】:

  • 这并没有解决问题。你能检查我的更新吗?
  • @Ben -- “forRoot()” 表示您正在调用在导入的模块上定义的方法,该模块运行该模块的配置或设置。如果需要,您还可以在自定义模块中定义类似“forChild()”的方法并调用它。此方法用于诸如为服务设置提供者之类的任务。这也是您在 Angular 中获得单例服务的方式。见angular.io/guide/singleton-services
  • 让 AppRoutingModule 成为导入的第一个解决问题
  • 感谢在 FormsModule 为我解决问题之前移动 RouterModule
【解决方案3】:

我将添加另一个我遇到相同错误但只是一个假人的情况。我已经添加了[routerLinkActiveOptions]="{exact: true}",但还没有添加routerLinkActive="active"

我的错误代码是

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

应该是什么时候

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

没有routerLinkActive,你就不能拥有routerLinkActiveOptions

【讨论】:

    【解决方案4】:

    当它应该工作时没有其他工作时,重新启动 ng serve。发现这样的bug很可惜。

    【讨论】:

    • 能符合有bug。我只是不断删除 dist 文件夹的内容并重建。最后它奏效了。尝试为 app.component.ts 中的每个组件添加一个链接。如果这不起作用,你唯一的选择就是祈祷和禁食。
    • 是的,重新启动 ng 服务器为我解决了这个问题。在确保我在模块中导入了 RouterModule 之后。谢谢@Tudor
    【解决方案5】:

    您需要将RouterMoudle 添加到包含Header 组件的模块的imports 部分

    【讨论】:

      【解决方案6】:

      这个问题是因为你没有导入模块

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

      而且你必须在导入部分声明这个模块

         imports:[RouterModule]
      

      【讨论】:

        【解决方案7】:

        就我而言,我只需要将新创建的组件导入到 RouterModule

        {path: 'newPath', component: newComponent}
        

        然后在您的app.module 中导入路由器并配置路由:

        从'@angular/router'导入{RouterModule};

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

        希望这对某人有所帮助!!!

        【讨论】:

          【解决方案8】:

          我正在为我的 Angular 应用程序运行测试,但也遇到了错误 Can't bind to 'routerLink' since it isn't a known property of 'a'

          我认为展示我的 Angular 依赖项可能很有用:

              "@angular/animations": "^8.2.14",
              "@angular/common": "^8.2.14",
              "@angular/compiler": "^8.2.14",
              "@angular/core": "^8.2.14",
              "@angular/forms": "^8.2.14",
              "@angular/router": "^8.2.14",
          

          问题出在我的spec 文件中。我比较了另一个类似的组件spec 文件,发现我在imports 中缺少RouterTestingModule,例如

              TestBed.configureTestingModule({
                declarations: [
                  ...
                ],
                imports: [ReactiveFormsModule, HttpClientTestingModule, RouterTestingModule],
                providers: [...]
              });
            });
          

          【讨论】:

            【解决方案9】:

            我完全为这个方法选择了另一种方式。

            app.component.ts

            import { Router } from '@angular/router';
            export class AppComponent {
            
               constructor(
                    private router: Router,
                ) {}
            
                routerComment() {
                    this.router.navigateByUrl('/marketing/social/comment');
                }
            }
            

            app.component.html

            <button (click)="routerComment()">Router Link </button>
            

            【讨论】:

              【解决方案10】:

              即使我已从 app-routing.module 导出 RouterModule 并在 Root 模块(app 模块)中导入了 app-routingModule,我也收到此错误。

              然后我发现,我只在路由模块中导入了组件。

              在我的根模块(App Module)中声明组件解决了这个问题。

              declarations: [
              AppComponent,
              NavBarComponent,
              HomeComponent,
              LoginComponent],
              

              【讨论】:

                【解决方案11】:

                你需要在你的主module.ts文件中导入RouterModule

                import {RouterModule} from '@angular/router';
                
                
                @NgModule({
                  imports: [RouterModule],
                 )}
                

                【讨论】:

                  【解决方案12】:

                  在当前组件的模块中导入RouterModule

                  喜欢:-

                  import {RouterModule} from '@angular/router';
                  @NgModule({
                     declarations:[YourComponents],
                     imports:[RouterModule]
                  

                  ...

                  它帮助了我。

                  【讨论】:

                    【解决方案13】:

                    我刚刚为此浪费了大约 2 个小时。这是我的 Visual Studio 的一个错误。我不得不重新安装 Angular 并再次更新我的 NPM,现在它又可以工作了。

                    【讨论】:

                      猜你喜欢
                      • 2017-02-05
                      • 2019-04-08
                      • 2016-09-05
                      • 2017-04-06
                      • 1970-01-01
                      • 2016-03-22
                      • 1970-01-01
                      • 2017-02-03
                      相关资源
                      最近更新 更多