Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular 7 and can't bind to 'routerlink' since it isn't a known property of 'a'

I am creating a new Angular 7 app and I have been researching this problem for the last few days, but I unable to find a solution to this error:

can't bind to 'routerlink' since it isn't a known property of 'a'

Here are some of the articles I have looked at Angular2 Exception: Can't bind to 'routerLink' since it isn't a known native property and Getting Can't bind to 'routerLink' since it isn't a known property of 'a'. error in spite of referencing router moudule but "no-go".

Here is the layout:

app -> navigation Here is the code:

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { UltiMaterialModule } from './ulti-material/ulti-material.module';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { HttpClientModule } from '@angular/common/http';
import { LayoutModule } from '@angular/cdk/layout';
import { NavigationModule } from './navigation/navigation.module';
import { AppRoutingModule } from './app-routing.module';
import { RouterModule } from '@angular/router';

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

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    RouterModule,
    AppRoutingModule,
    BrowserModule,
    BrowserAnimationsModule,
    LayoutModule,
    HttpClientModule,
    UltiMaterialModule, // ulti-nav/ulti-nav.component.ts
    NavigationModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

app-routing.module.ts

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

export const AppRoutes: Routes = [
  { path: '**',  loadChildren: './navigation/navigation.module#NavigationModule', pathMatch: 'full' }
];

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

app.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {}

app.component.html

<!--The content below is only a placeholder and can be replaced.-->
<app-navigation></app-navigation>

navigation/navigation.module.ts

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

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

import { BrowserModule } from '@angular/platform-browser';

import { UltiMaterialModule } from '../ulti-material/ulti-material.module';

import { VendorsComponent } from '../vendors/vendors.component';
import { DashboardComponent } from '../dashboard/dashboard.component';
import { UserPanelComponent } from '../user-panel/user-panel.component';
import { QuestionnaireComponent } from '../questionnaire/questionnaire.component';
import { NavigationComponent } from './navigation.component';

import { NavigationRoutingModule } from './navigation-routing.module';


@NgModule({
  declarations: [
    VendorsComponent,
    DashboardComponent,
    UserPanelComponent,
    QuestionnaireComponent,
    NavigationComponent
  ],
  imports: [
    RouterModule,
    BrowserModule,
    CommonModule,
    UltiMaterialModule,
    NavigationRoutingModule
  ],
  exports: [
    NavigationComponent,
    RouterModule
  ]
})
export class NavigationModule {}

navigation/navigation-router.module.ts

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { VendorsComponent } from '../vendors/vendors.component';
import { DashboardComponent } from '../dashboard/dashboard.component';

export const NavigationRoutes: Routes = [
  { path: 'home', redirectTo: 'dashboard', pathMatch: 'full' },
  { path: 'vendors', component: VendorsComponent },
  { path: 'dashboard', component: DashboardComponent },
  { path: '', redirectTo: 'dashboard', pathMatch: 'full' }
];

@NgModule({
  imports: [ RouterModule.forChild(NavigationRoutes) ],
  exports: [ RouterModule ]
})
export class NavigationRoutingModule {}

navigation/navigation.component.ts

import { Component } from '@angular/core';
import { BreakpointObserver, Breakpoints, BreakpointState } from '@angular/cdk/layout';
import {
  Router,
  Event as RouterEvent,
  NavigationStart,
  NavigationEnd,
  NavigationCancel,
  NavigationError
} from '@angular/router';
import { ActivatedRoute } from '@angular/router';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Component({
  selector: 'app-navigation',
  templateUrl: './navigation.component.html',
  styleUrls: ['./navigation.component.scss']
})
export class NavigationComponent {

  // Native Template fails on Button mat-icon render with always false. Had to reconstruct based on:
  // https://stackoverflow.com/questions/50525676/angular-6-material-nav-component-template-parse-errors-unexpected-token?rq=1
  /*
  isHandset$: Observable<boolean> = this.breakpointObserver.observe(Breakpoints.Handset)
    .pipe(
      map(result => result.matches)
    );
  */

  isHandset$: Observable<BreakpointState> = this.breakpointObserver.observe(Breakpoints.Handset);

  _loading = true;
  public get showLoadingIndicator() {
    return this._loading;
  }
  public set showLoadingIndicator(value) {
    this._loading = value;
  }

  constructor(private breakpointObserver: BreakpointObserver,
    private router: Router,
    private route: ActivatedRoute
    ) {

    router.events.subscribe((event: RouterEvent) => {
      this.navigationInterceptor(event);
    });
  }

  // Shows and hides the loading spinner during RouterEvent changes
  navigationInterceptor(event: RouterEvent): void {
    if (event instanceof NavigationStart) {
      this._loading = true;
    }
    if (event instanceof NavigationEnd) {
      this._loading = false;
    }

    // Set loading state to false in both of the below events to hide the spinner in case a request fails
    if (event instanceof NavigationCancel) {
      this._loading = false;
    }
    if (event instanceof NavigationError) {
      this._loading = false;
    }
  }
}

navigation.component.html

<div *ngIf="showLoadingIndicator" class="loading-indicator"><mat-spinner></mat-spinner></div>
<mat-toolbar color="primary">
    <button 
      type="button"
      aria-label="Toggle sidenav"
      mat-icon-button
      (click)="drawer.toggle()"
      *ngIf="isHandset$ | async">
      <mat-icon aria-label="Side nav toggle icon">menu</mat-icon>
    </button>
    <span><mat-icon class="logo" svgIcon="logo2"></mat-icon></span>
    <span class="span-fill-remaining-space"></span>
    <span>Global Security Research Project System</span>
    <button 
      type="button"
      aria-label="Toggle sidenav"
      mat-icon-button
      (click)="user.toggle()"
      *ngIf="isHandset$ | async">
      <mat-icon aria-label="Side nav toggle icon">account_circle</mat-icon>
    </button>
</mat-toolbar>
<mat-sidenav-container class="sidenav-container">
  <mat-sidenav
    #drawer
    class="sidenav"
    fixedInViewport="false"
    fixedTopGap="64"
    [attr.role]="(isHandset$ | async) ? 'dialog' : 'navigation'"
    [mode]="(isHandset$ | async) ? 'over' : 'side'"
    [opened]="!(isHandset$ | async)">
    <mat-nav-list>
      <a mat-list-item >
        <mat-icon class="icon">home</mat-icon>
        <span class="label">Home</span>
      </a>
      <a mat-list-item >
        <mat-icon class="developer_board">developer_board</mat-icon>
        <span class="label">Project</span>
      </a>
      <a mat-list-item >
        <mat-icon class="how_to_reg">how_to_reg</mat-icon>
        <span class="label">Products</span>
      </a>
      <a mat-list-item>
        <mat-icon class="people">people</mat-icon>
        <span class="label">Teams</span>
      </a>
      <a mat-list-item [routerlink]="['/vendors']" routerLinkActive>
        <mat-icon class="store">store</mat-icon>
        <span class="label">Vendors</span>
      </a>
      <a mat-list-item>
        <mat-icon class="dashboard">dashboard</mat-icon>
        <span class="label">Dashboard</span>
      </a>
      <a mat-list-item>
        <mat-icon class="question_answer">question_answer</mat-icon>
        <span class="label">Questionnaire</span>
      </a>
    </mat-nav-list>
  </mat-sidenav>
  <mat-sidenav 
    #user
    position="end">
    <app-user-panel></app-user-panel>
  </mat-sidenav>
  <mat-sidenav-content>
    <div class="material-page-spacing">
      <router-outlet></router-outlet>
    </div>
  </mat-sidenav-content>
</mat-sidenav-container>

package.json - dependencies

"@angular/animations": "^7.0.2",
"@angular/cdk": "^7.0.2",
"@angular/common": "^7.0.2",
"@angular/compiler": "^7.0.2",
"@angular/core": "^7.0.2",
"@angular/forms": "^7.0.2",
"@angular/http": "^7.0.2",
"@angular/material": "^7.0.2",
"@angular/platform-browser": "^7.0.2",
"@angular/platform-browser-dynamic": "^7.0.2",
"@angular/router": "^7.0.2",
"angular-oauth2-oidc": "^5.0.2",
"core-js": "^2.5.4",
"material-design-icons": "^3.0.1",
"rxjs": "~6.3.3",
"speed-measure-webpack-plugin": "^1.2.3",
"zone.js": "~0.8.26"

I am at a loss on what the problem is. I have the proper imports and exports from what I can tell. If you see something that I cannot please feel free to comment.

If you need more information, such as more code, also please let me know.

like image 467
thxmike Avatar asked Nov 04 '18 18:11

thxmike


2 Answers

The property routerLink is case sensitive.

change [routerlink] to [routerLink]

[routerLink]="['/vendors']"
like image 179
Jameel Moideen Avatar answered Oct 24 '22 22:10

Jameel Moideen


For those people who have routerLink camel cased correctly and are still getting the same error, you probably have not imported RouterModule inside the module that defines your component.

import {RouterModule} from '@angular/router';
@NgModule({
   declarations:[YourComponents],
   imports:[RouterModule]
...
like image 31
njmwas Avatar answered Oct 24 '22 22:10

njmwas