De toute évidence, la version bêta d'Angular2 est plus récente que nouvelle, il n'y a donc pas beaucoup d'informations, mais j'essaie de faire ce que je pense être un routage assez basique.
Le piratage avec le code de démarrage rapide et d'autres extraits du site Web https://angular.io a donné la structure de fichiers suivante:
angular-testapp/
app/
app.component.ts
boot.ts
routing-test.component.ts
index.html
Les fichiers étant remplis 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.component.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 { }
routing-test.component.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 { }
La tentative d'exécution de 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 problème vaguement lié ici; Les directives de liaison de routeur sont brisées après la mise à niveau vers angular2.0.0-beta.0 . Cependant, "l'exemple de travail" dans l'une des réponses est basé sur du code pré-bêta - qui pourrait bien encore fonctionner, mais je voudrais savoir pourquoi le code que j'ai créé ne fonctionne pas.
Tous les pointeurs seraient reçus avec reconnaissance!
directives: [ROUTER_DIRECTIVES]
.@Component({selector: "app"}) @View({templateUrl: "app.html", directives: [ROUTER_DIRECTIVES, RouterLink]})
directives: [ROUTER_DIRECTIVES]
et le passage de [router-link] à [routerLink], je ne reçois plus l'erreur.Réponses:
> = RC.5
importer le
RouterModule
Voir aussi https://angular.io/guide/router> = RC.2
app.routes.ts
main.ts
<= RC.1
Votre code est manquant
Vous ne pouvez pas utiliser des directives comme
routerLink
ourouter-outlet
sans les faire connaître à votre composant.Alors que les noms de directive ont été modifiés pour respecter la casse dans Angular2, les éléments utilisent toujours
-
le nom comme<router-outlet>
pour être compatibles avec la spécification des composants Web qui nécessitent un-
dans le nom des éléments personnalisés.s'inscrire dans le monde
Pour rendre
ROUTER_DIRECTIVES
disponible globalement, ajoutez ce fournisseur àbootstrap(...)
:alors il n'est plus nécessaire d'ajouter
ROUTER_DIRECTIVES
à chaque composant.la source
provide(PLATFORM_DIRECTIVES, {useValue: [ROUTER_DIRECTIVES, FORM_DIRECTIVES, ETC...], multi: true})
FORM_DIRECTIVES
sont déjà inclusPLATFORM_DIRECTIVES
par défaut.Pour les personnes qui trouvent cela en tentant d'exécuter des tests parce que via
npm test
ou enng test
utilisant Karma ou autre chose. Votre module .spec a besoin d'un import de test de routeur spécial pour pouvoir être construit.http://www.kirjai.com/ng2-component-testing-routerlink-routeroutlet/
la source
spec
fichier que je devais l'ajouter. Merci @raykrow!RouterModule
, alors vous devez appelerforRoot
pour satisfaire le module et ensuite vous devez fournir leBASE_HREF
et ...Can't bind to 'active' since it isn't a known property of 'a'.
dans plusieurs de mes tests unitaires et j'ai importéRouterTestingModule
.Avertissement lors du codage avec Visual Studio (2013)
J'ai perdu 4 à 5 heures à essayer de déboguer cette erreur. J'ai essayé toutes les solutions que j'ai trouvées sur StackOverflow par la lettre et j'ai toujours cette erreur:
Can't bind to 'routerlink' since it isn't a known native property
Sachez que Visual Studio a la mauvaise habitude de mettre automatiquement en forme du texte lorsque vous copiez / collez du code. J'ai toujours obtenu un petit ajustement instantané de VS13 (l'étui camel disparaît).
Ce:
Devient:
C'est une petite différence, mais suffisante pour déclencher l'erreur. La partie la plus laide est que cette petite différence a continué à éviter mon attention à chaque fois que je copiais et collais. Par pur hasard, j'ai vu cette petite différence et l'ai résolue.
la source
Pour> = V5
composant:
Pour <V5
Peut également être utilisé
RouterLink
comme undirectives
ie.directives: [RouterLink]
. qui a fonctionné pour moila source
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 ledirectives
tableau de métadonnées. Tel est le cas ici.Puisque vous n'avez pas spécifié
RouterLink
ni la constanteROUTER_DIRECTIVES
- qui contient les éléments suivants :- dans le
directives
tableau, puis lorsque l'analyse angulaireil ne connaît pas la directive RouterLink (qui utilise le sélecteur d' attribut
routerLink
). Étant donné qu'Angular sait ce qu'est l'a
élément, il suppose qu'il[routerLink]="..."
s'agit d'une liaison de propriété pour l'a
élément. Mais il découvre alors que cerouterLink
n'est pas une propriété native desa
éléments, d'où il lève l'exception concernant la propriété inconnue.Je n'ai jamais vraiment aimé l' ambiguïté de la syntaxe . C'est à dire, considérez
Rien qu'en regardant le HTML, on ne sait pas si
whatIsThis
c'estsomething
something
Nous devons savoir lesquelles
directives: [...]
sont spécifiées dans les métadonnées du composant / directive afin d'interpréter mentalement le HTML. Et lorsque nous oublions de mettre quelque chose dans ledirectives
tableau, je pense que cette ambiguïté rend le débogage un peu plus difficile.la source
Vous avez dans votre module
vous devez exporter le module RouteModule
exemple:
pour pouvoir accéder aux fonctionnalités pour tous ceux qui importent ce module.
la source
J'ai essayé toutes les méthodes mentionnées ci-dessus, mais aucune méthode ne fonctionne pour moi.Enfin, j'ai obtenu une solution pour le problème ci-dessus et cela fonctionne pour moi.
J'ai essayé cette méthode:
En Html:
Dans le fichier TS:
la source
Dans mon cas, j'ai importé le module RouterModule in App mais pas importé dans mon module de fonctionnalités. Après l'importation du module routeur dans mon EventModule, l'erreur disparaît.
la source
Si vous obtenez cette erreur pendant les tests unitaires, veuillez écrire ceci.
la source
J'apprécie vraiment la réponse de @ raykrow quand on a ce problème uniquement dans un fichier de test! C'est là que je l'ai rencontré.
Comme il est souvent utile d'avoir une autre façon de faire quelque chose en tant que sauvegarde, je voulais mentionner cette technique qui fonctionne également (au lieu d'importer
RouterTestingModule
):(En règle générale, on utiliserait
routerLink
un<a>
élément mais ajusterait le sélecteur en conséquence pour les autres composants.)La deuxième raison pour laquelle je voulais mentionner cette solution alternative est que, même si elle m'a bien servi dans un certain nombre de fichiers de spécifications, j'ai rencontré un problème avec elle dans un cas:
Je ne pouvais pas vraiment comprendre comment cette maquette et la mienne
ButtonComponent
utilisaient le même sélecteur, alors la recherche d'une autre approche m'a conduit ici à la solution de @ raykrow.la source
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é à partir d'ici RouterLink ne fonctionne pas
la source
Ma solution est simple. J'utilise [href] au lieu de [routerLink]. J'ai essayé toutes les solutions pour [routerLink]. Aucun d'eux ne fonctionne dans mon cas.
Voici ma solution:
Écrivez ensuite la
getPlanUrl
fonction dans le fichier TS.la source