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!
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.
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 /
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.
> = 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},
])
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.
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.
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 {
}
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']);
}
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.
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
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.