【问题标题】:Error while configuring angular2 app navigation and routing配置 angular2 应用导航和路由时出错
【发布时间】:2016-10-13 10:50:15
【问题描述】:

尝试使用 angular-cli 创建带有 angular2 的应用程序,但遇到以下问题: 我想配置导航和路由,但出现以下错误:

未处理的 Promise 拒绝:模板解析错误:无法绑定到 'routerLink' 因为它不是 'a' 的已知属性。 ("s="导航栏 navbar-fixed-top navbar-custom">

][routerLink]="['/home']">FiT

应用结构如下:

app/
  core/
    nav/
      nav.component.ts|html|scss  
      core.module.ts
  home/
    home.component.ts|html|scss
  app-routing.module.ts   
  app.component.ts|html|scss   
  app.module.ts

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 { AppRoutingModule } from './app-routing.module';
import { CoreModule } from './core/core.module';

import { AppComponent } from './app.component';
import { HomeComponent } from './home/home.component';

@NgModule({
  declarations: [
    AppComponent,
    HomeComponent,
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    AppRoutingModule,
    CoreModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

core.module.ts:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { NavComponent } from './nav/nav.component';

@NgModule({
  imports: [
    CommonModule // we use ngFor
  ],
  exports: [NavComponent],
  declarations: [NavComponent],
})
export class CoreModule { }

app-routing.module.ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

import { HomeComponent } from './home/home.component';

const routes: Routes = [
  {
    path: '',
    component: HomeComponent
  },
  {
    path: 'home',
    component: HomeComponent
  },
];

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

nav.component.html

<nav class="navbar navbar-fixed-top navbar-custom">
  <div class="container">
    <a class="navbar-brand"  [routerLink]="['/home']">FiT</a>
    <button class="navbar-toggler hidden-md-up" type="button" data-toggle="collapse" data-target="#fit-nav" aria-controls="fit-nav" aria-expanded="false" aria-label="Toggle navigation">
      &#9776;
    </button>
    <div class="collapse navbar-toggleable-sm" id="fit-nav">
      <ul class="nav navbar-nav pull-md-right">
        <li class="nav-item">
          <a class="nav-link">link</a>
        </li>
        <li class="nav-item">
          <a class="nav-link">link</a>
        </li>
        <li class="nav-item">
          <a class="nav-link">Log in</a>
        </li>
        <li class="nav-item">
          <a class="nav-link">sign up</a>
        </li>
      </ul>
    </div>
  </div>
</nav>

所以我试图找出答案,我看到了许多类似的问题,但提出的解决方案没有帮助。

代码中的一切看起来都很好。也许我错过了什么?

【问题讨论】:

    标签: angular angular-cli


    【解决方案1】:

    指令、组件和管道的范围仅限于声明它们的模块,除非它导入导出这些项目的模块。例如

    @NgModule({
      declarations: [ SomeComponentThatUsesRouterLink ]
    })
    class SomeModule {}
    
    @NgModule({
      imports: [
        SomeModule,  <== SomeComponentThatUsesRouterLink can't use routerLink
        RouterModule
      ],
      declarations: [
        AppComponent <== Can use routerLink
      ]
    })
    class AppModule {}
    

    在这里,即使AppModule 导入了RouterModule,它的作用域也仅限于它自己的declarations,而不是SharedModule,因此SomeComponentThatUsesRouterLink 不能使用routerLink 指令。

    现在看这里

    @NgModule({
      exports: [ RouterModule, CommonModule, FormsModule ]
    })
    class SharedModule {}
    
    @NgModule({
      imports: [ SharedModule ],
      declarations: [ SomeComponentThatUsesRouterLink ]
    })
    class SomeModule {}
    

    现在SomeModule 可以使用RouteModule 指令,因为它导入了一个导出它的模块

    或者如果你想要SomeModule 可以只导入RouterModule 本身

    @NgModule({
      imports: [ RouterModule ],
      declarations: [ SomeComponentThatUsesRouterLink ]
    })
    class SomeModule {}
    

    因此,要解决您特定情况下的问题,您需要将RouterModule 导入CoreModule,因为NavComponent 需要路由器指令

    【讨论】:

      【解决方案2】:

      你有一个语法错误

      <a class="navbar-brand"  routerLink="/home">FiT</a>
      

      【讨论】:

      • 谢谢你,Sefa Ümit Oray。现在可以了。但我在文档中看到链接可以有这样的字符串路径:routerLink="..." 或者我们可以将 RouterLink 指令绑定到这样的数组:英雄。那么为什么第二种方法对我不起作用?
      • @lalexa 您需要将 RouterModule 导入到导入导航组件的模块中才能使用 [routerLink] 语法。
      • @SefaÜmitOray 这不是真的。您甚至需要在答案中使用语法。但是使用您的语法,它不会在启动时失败。但是路由器链接不起作用,因为没有路由器指令,它在RouterModule中
      • @peeskillet 你所说的在技术上是正确的,但注册路由需要使用 RouterModule.forRoot(routes) 并将其导入应用程序模块,这使我的语法在应用程序范围内可用。
      • @SefaÜmitOray 但是路线已经定义好了。那不是问题。 forRoot 用于获取所有路由提供程序。您不要在不需要配置路由的模块中使用它或 forChild。如果模块只需要路由指令,那么您只需导入 RouterModule,因为它导出所有指令
      猜你喜欢
      • 2016-11-14
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 2016-11-17
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多