Exception Angular2: ne peut pas se lier à 'routerLink' puisqu'il ne s'agit pas d'une propriété native connue

évidemment la beta Pour Angular2 est plus récente que nouvelle, donc il n'y a pas beaucoup d'informations là-bas, mais j'essaie de faire ce que je pense être un routage assez basique.

Hacking sur le démarrage rapide du code et d'autres extraits de la https://angular.io site web a abouti à la structure suivante:

angular-testapp/
    app/
        app.component.ts
        boot.ts
        routing-test.component.ts
    index.html

avec les fichiers à remplir comme suit:

index.html

<html>

  <head>
    <base href="/">
    <title>Angular 2 QuickStart</title>
    <link href="../css/bootstrap.css" rel="stylesheet">

    <!-- 1. Load libraries -->
    <script src="node_modules/angular2/bundles/angular2-polyfills.js"></script>
    <script src="node_modules/systemjs/dist/system.src.js"></script>
    <script src="node_modules/rxjs/bundles/Rx.js"></script>
    <script src="node_modules/angular2/bundles/angular2.dev.js"></script>
    <script src="node_modules/angular2/bundles/router.dev.js"></script>

    <!-- 2. Configure SystemJS -->
    <script>
      System.config({
        packages: {        
          app: {
            format: 'register',
            defaultExtension: 'js'
          }
        }
      });
      System.import('app/boot')
            .then(null, console.error.bind(console));
    </script>

  </head>

  <!-- 3. Display the application -->
  <body>
    <my-app>Loading...</my-app>
  </body>

</html>

boot.ts

import {bootstrap}    from 'angular2/platform/browser'
import {ROUTER_PROVIDERS} from 'angular2/router';

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

bootstrap(AppComponent, [
    ROUTER_PROVIDERS
]);

app.composant.ts

import {Component} from 'angular2/core';
import {RouteConfig, ROUTER_DIRECTIVES, ROUTER_PROVIDERS, LocationStrategy, HashLocationStrategy} from 'angular2/router';

import {RoutingTestComponent} from './routing-test.component';

@Component({
    selector: 'my-app',
    template: `
        <h1>Component Router</h1>
        <a [routerLink]="['RoutingTest']">Routing Test</a>
        <router-outlet></router-outlet>
        `
})

@RouteConfig([
    {path:'/routing-test', name: 'RoutingTest', component: RoutingTestComponent, useAsDefault: true},
])

export class AppComponent { }

routage-test.composant.ts

import {Component} from 'angular2/core';
import {Router} from 'angular2/router';

@Component({
    template: `
        <h2>Routing Test</h2>
        <p>Interesting stuff goes here!</p>
        `
})
export class RoutingTestComponent { }

essayer d'exécuter ce code produit l'erreur:

EXCEPTION: Template parse errors:
Can't bind to 'routerLink' since it isn't a known native property ("
        <h1>Component Router</h1>
        <a [ERROR ->][routerLink]="['RoutingTest']">Routing Test</a>
        <router-outlet></router-outlet>
        "): AppComponent@2:11

j'ai trouvé un vaguement liés question ici; routeur-lien de directives cassée après mise à niveau vers angular2.0.0-bêta.0 . Toutefois, l ' "exemple" dans l'une des réponses est basé sur un code pré-bêta - ce qui peut bien fonctionner, mais je voudrais savoir pourquoi le code que j'ai créé n'est pas de travail.

tous les conseils seraient reçus avec gratitude!

193
demandé sur maninak 2015-12-16 19:21:19

11 réponses

>=RC.5

importer le RouterModule Voir aussi https://angular.io/guide/router

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

>=RC.2

app.route.ts

import { provideRouter, RouterConfig } from '@angular/router';

export const routes: RouterConfig = [
  ...
];

export const APP_ROUTER_PROVIDERS = [provideRouter(routes)];

principal.ts

import { bootstrap } from '@angular/platform-browser-dynamic';
import { APP_ROUTER_PROVIDERS } from './app.routes';

bootstrap(AppComponent, [APP_ROUTER_PROVIDERS]);

<=RC.1

votre code est manquant

  @Component({
    ...
    directives: [ROUTER_DIRECTIVES],
    ...)}

vous ne pouvez pas utiliser des directives comme routerLink ou router-outlet sans les faire connaître à votre composant.

alors que les noms de directive ont été changés pour être sensibles à la casse en Angular2, les éléments utilisent encore - dans le nom comme <router-outlet> pour être compatible avec les spécifications web-components qui exigent un - dans le nom des éléments personnalisés.

s'inscrire à l'échelle mondiale

pour rendre ROUTER_DIRECTIVES globalement disponible, ajouter ce fournisseur à bootstrap(...) :

provide(PLATFORM_DIRECTIVES, {useValue: [ROUTER_DIRECTIVES], multi: true})

, alors il n'est plus nécessaire d'ajouter ROUTER_DIRECTIVES à chaque composant.

288
répondu Günter Zöchbauer 2018-08-23 08:25:31

pour les personnes qui trouvent cela en essayant d'exécuter des tests parce que via npm test ou ng test en utilisant le Karma ou n'importe quoi d'autre. Votre. le module spec nécessite un test de routeur spécial pour pouvoir être construit.

import { RouterTestingModule } from '@angular/router/testing';

  TestBed.configureTestingModule({
    imports: [RouterTestingModule],
    declarations: [AppComponent],
  });

http://www.kirjai.com/ng2-component-testing-routerlink-routeroutlet /

78
répondu raykrow 2017-03-01 06:30:42

mise en garde lors du codage avec Visual Studio (2013)

j'ai perdu 4 à 5 heures à essayer de corriger cette erreur. J'ai essayé toutes les solutions que j'ai trouvées sur stackoverflow par la lettre et j'ai encore cette erreur: Can't bind to 'routerlink' since it isn't a known native property

soyez conscient, Visual Studio a le mauvais habbit de texte autoformatting quand vous copiez/collez le code. J'ai toujours eu un petit ajustement instantané de VS13 (camel case disparaît).

:

<div>
    <a [routerLink]="['/catalog']">Catalog</a>
    <a [routerLink]="['/summary']">Summary</a>
</div>

devient:

<div>
    <a [routerlink]="['/catalog']">Catalog</a>
    <a [routerlink]="['/summary']">Summary</a>
</div>

C'est une petite différence, mais assez pour déclencher l'erreur. Le plus moche, c'est que cette petite différence évitait mon attention chaque fois que je copiais et collais. Par pur hasard, j'ai vu cette petite différence et je l'ai résolue.

22
répondu Adrian Moisa 2016-07-30 13:05:30

> = V5

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

const appRoutes: Routes = [
  {path:'routing-test', component: RoutingTestComponent}
];

@NgModule({
  imports: [
    RouterModule.forRoot(appRoutes)
    // other imports here
  ]
})

composant:

@Component({
    selector: 'my-app',
    template: `
        <h1>Component Router</h1>
        <a routerLink="/routing-test" routerLinkActive="active">Routing Test</a>
        <router-outlet></router-outlet>
        `
})

Pour < V5

peut aussi utiliser RouterLink comme directives ie. directives: [RouterLink] . qui a fonctionné pour moi

import {Router, RouteParams, RouterLink} from 'angular2/router';

@Component({
    selector: 'my-app',
    directives: [RouterLink],
    template: `
        <h1>Component Router</h1>
        <a [routerLink]="['RoutingTest']">Routing Test</a>
        <router-outlet></router-outlet>
        `
})

@RouteConfig([
    {path:'/routing-test', name: 'RoutingTest', component: RoutingTestComponent, useAsDefault: true},
])
9
répondu Shaishab Roy 2018-01-05 05:06:29

en général, chaque fois que vous obtenez une erreur comme Can't bind to 'xxx' since it isn't a known native property , la cause la plus probable est d'oublier de spécifier un composant ou une directive (ou une constante qui contient le composant ou la directive) dans le tableau de métadonnées directives . Tel est le cas ici.

puisque vous n'avez pas spécifié RouterLink ou la constante ROUTER_DIRECTIVES - qui contient le suivant :

export const ROUTER_DIRECTIVES = [RouterOutlet, RouterLink, RouterLinkWithHref, 
  RouterLinkActive];
"1519190920 – - dans le directives tableau, puis quand parses angulaires

<a [routerLink]="['RoutingTest']">Routing Test</a>

il ne connaît pas la directive RouterLink (qui utilise attribut sélecteur routerLink ). Puisque Angular ne sait pas ce qu'est l'élément a , il suppose que [routerLink]="..." est un bien liant pour l'élément a . Mais il découvre ensuite que routerLink n'est pas une propriété indigène des éléments a , donc il jette l'exception sur la propriété inconnue.


Je n'ai jamais vraiment aimé la ambiguïté de la syntaxe . C'est-à-dire: considérer

<something [whatIsThis]="..." ...>

juste en regardant le HTML on ne peut pas dire si whatIsThis est

  • un natif de la propriété de something
  • sélecteur d'attribut d'une directive
  • une entrée de la propriété de something

nous devons savoir quels directives: [...] sont spécifiés dans les métadonnées du composant/directive afin d'interpréter mentalement le HTML. Et quand on oublie de mettre quelque chose dans le tableau directives , je sens que cette ambiguïté le rend un peu plus difficile à déboguer.

8
répondu Mark Rajcok 2017-05-23 12:26:34

vous avez dans votre module

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

vous devez exporter le module RouteModule

exemple:

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

pour pouvoir accéder aux fonctionnalités pour tous ceux qui importent ce module.

7
répondu alehn96 2017-03-08 02:02:39

dans mon cas j'ai importé le RouterModule dans le module App mais pas importé dans mon module de fonctionnalité. Après avoir importé le module de routeur dans mon EventModule, l'erreur disparaît.

import {NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import {EventListComponent} from './EventList.Component';
import {EventThumbnailComponent} from './EventThumbnail.Component';
import { EventService } from './shared/Event.Service'
import {ToastrService} from '../shared/toastr.service';
import {EventDetailsComponent} from './event-details/event.details.component';
import { RouterModule } from "@angular/router";
@NgModule({
  imports:[BrowserModule,RouterModule],
  declarations:[EventThumbnailComponent,EventListComponent,EventDetailsComponent],
  exports: [EventThumbnailComponent,EventListComponent,EventDetailsComponent],
   providers: [EventService,ToastrService]
})
export class EventModule {

 }
3
répondu JameelM 2018-06-07 15:14:39

j'ai essayé toutes les méthodes, qui sont mentionnés ci-dessus.Mais aucune méthode ne fonctionne pour moi.finalement j'ai obtenu la solution pour la question ci-dessus et cela fonctionne pour moi.

j'ai essayé cette méthode:

En Html:

<li><a (click)= "aboutPageLoad()"  routerLinkActive="active">About</a></li>

dans le fichier TS:

aboutPageLoad() { this.router.navigate(['/about']); }

1
répondu Sunil Kumar K K 2016-08-12 06:19:32

j'apprécie vraiment la réponse de @raykrow quand on a ce problème seulement dans un fichier test! C'est là que j'ai rencontré.

comme il est souvent utile d'avoir une autre façon de faire quelque chose comme une sauvegarde, je voulais mentionner cette technique qui fonctionne aussi (au lieu d'importer RouterTestingModule ):

import { MockComponent } from 'ng2-mock-component';
. . .
TestBed.configureTestingModule({
  declarations: [
    MockComponent({
      selector: 'a',
      inputs: [ 'routerLink', 'routerLinkActiveOptions' ]
    }),
    . . .
  ]

(typiquement, on utilise routerLink sur un élément <a> mais on ajuste le sélecteur en conséquence pour les autres composants.)

la deuxième raison pour laquelle je voulais mentionner cette solution alternative est que, bien qu'elle m'ait bien servi dans un certain nombre de fichiers spec, j'ai rencontré un problème avec elle dans un cas:

Error: Template parse errors:
    More than one component matched on this element.
    Make sure that only one component's selector can match a given element.
    Conflicting components: ButtonComponent,Mock

Je n'ai pas tout à fait compris comment cette maquette et mon ButtonComponent utilisaient le même sélecteur, donc la recherche d'une autre approche m'a conduit ici à la solution de @raykrow.

0
répondu Michael Sorens 2017-12-23 19:40:32

si vous utilisez des modules partagés, ajoutez simplement RouterModule à un Module où votre composant est déclaré et n'oubliez pas d'ajouter <router-outlet></router-outlet>

référencé d'ici RouterLink ne fonctionne pas

0
répondu Yevheniy Potupa 2018-05-09 15:42:56

ma solution est simple. J'utilise [href] au lieu de [routerLink]. J'ai essayé toutes les solutions pour [routerLink]. Aucun d'entre eux travaille dans mon cas.

voici ma solution:

<a [href]="getPlanUrl()" target="_blank">My Plan Name</a>

Ecrivez ensuite la fonction getPlanUrl dans le fichier TS.

-5
répondu G Chen 2016-09-14 19:12:04