Oczywiście beta dla Angular2 jest nowszy niż nowy, więc nie ma tam wielu informacji, ale staram się robić to, co uważam za dość podstawowy routing.
Włamywanie się za pomocą kodu szybkiego startu i innych fragmentów ze strony https://angular.io spowodowało następującą strukturę plików:
angular-testapp/
app/
app.component.ts
boot.ts
routing-test.component.ts
index.html
Pliki są wypełniane w następujący sposób:
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 { }
Próba uruchomienia tego kodu powoduje błąd:
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
Znalazłem tutaj niejasno powiązany problem; po aktualizacji do angular2.0.0-beta.0 zepsute dyrektywy router-link . Jednak „działający przykład” w jednej z odpowiedzi opiera się na kodzie wcześniejszym niż beta - co może nadal działać, ale chciałbym wiedzieć, dlaczego utworzony przeze mnie kod nie działa.
Wszelkie wskazówki zostaną z wdzięcznością przyjęte!
directives: [ROUTER_DIRECTIVES]
.@Component({selector: "app"}) @View({templateUrl: "app.html", directives: [ROUTER_DIRECTIVES, RouterLink]})
directives: [ROUTER_DIRECTIVES]
i zmianie z [router-link] na [routerLink] nie pojawia się już błąd.Odpowiedzi:
> = RC.5
zaimportuj
RouterModule
Zobacz także https://angular.io/guide/router> = RC.2
app.routes.ts
main.ts
<= RC.1
Brakuje twojego kodu
Nie można używać dyrektyw takich jak
routerLink
lubrouter-outlet
bez podawania ich do wiadomości komponentowi.Podczas gdy w nazwach dyrektyw zmieniono rozróżnianie wielkości liter w Angular2, elementy nadal używają
-
nazwy,<router-outlet>
aby być zgodnym ze specyfikacją składników WWW, która wymaga-
w nazwie elementów niestandardowych.zarejestruj się globalnie
Aby udostępnić
ROUTER_DIRECTIVES
globalnie, dodaj tego dostawcę dobootstrap(...)
:to nie jest już konieczne dodawanie
ROUTER_DIRECTIVES
do każdego komponentu.źródło
provide(PLATFORM_DIRECTIVES, {useValue: [ROUTER_DIRECTIVES, FORM_DIRECTIVES, ETC...], multi: true})
FORM_DIRECTIVES
sąPLATFORM_DIRECTIVES
już domyślnie uwzględnione.Dla ludzi, którzy znaleźli to przy próbie testy zakończą ponieważ poprzez
npm test
lubng test
za pomocą Karma czy cokolwiek innego. Twój moduł .spec wymaga specjalnego importu testującego router, aby móc budować.http://www.kirjai.com/ng2-component-testing-routerlink-routeroutlet/
źródło
spec
musiałem to dodać w pliku. Dzięki @raykrow!RouterModule
musisz zadzwonić,forRoot
aby zaspokoić moduł, a następnie powinieneś dostarczyćBASE_HREF
...Can't bind to 'active' since it isn't a known property of 'a'.
w kilku moich testach jednostkowych i zaimportowałemRouterTestingModule
.Uwaga przy programowaniu w Visual Studio (2013)
Zmarnowałem 4 do 5 godzin, próbując debugować ten błąd. Wypróbowałem wszystkie rozwiązania, które znalazłem na StackOverflow, i nadal otrzymuję ten błąd:
Can't bind to 'routerlink' since it isn't a known native property
Pamiętaj, że Visual Studio ma nieprzyjemny zwyczaj automatycznego formatowania tekstu podczas kopiowania / wklejania kodu. Zawsze otrzymywałem niewielką natychmiastową regulację z VS13 (obudowa wielbłąda znika).
To:
Staje się:
To niewielka różnica, ale wystarczająca do wyzwolenia błędu. Najbrzydsze jest to, że ta niewielka różnica po prostu unikała mojej uwagi za każdym razem, gdy kopiowałem i wklejałem. Przez przypadek zobaczyłem tę małą różnicę i rozwiązałem ją.
źródło
Dla> = V5
składnik:
Dla <V5
Można również użyć
RouterLink
jakodirectives
tj.directives: [RouterLink]
. to działało dla mnieźródło
Zasadniczo, gdy pojawi się taki błąd
Can't bind to 'xxx' since it isn't a known native property
, najbardziej prawdopodobną przyczyną jest zapomnienie podania komponentu lub dyrektywy (lub stałej zawierającej komponent lub dyrektywę) wdirectives
tablicy metadanych. Tak jest w tym przypadku.Ponieważ nie określono
RouterLink
ani stałejROUTER_DIRECTIVES
- która zawiera następujące elementy :- w
directives
tablicy, a następnie podczas analizy kątowejnie wie o dyrektywie RouterLink (która korzysta z selektora atrybutów
routerLink
). Ponieważ Angular nie wie, co toa
jest element, zakłada, że[routerLink]="..."
jest to wiązanie właściwościa
elementu. Ale potem odkrywa, żerouterLink
nie jest natywną własnościąa
elementów, dlatego zgłasza wyjątek dotyczący nieznanej właściwości.Nigdy tak naprawdę nie lubiłem dwuznaczności składni . To znaczy, zastanów się
Po prostu patrząc na HTML nie możemy stwierdzić, czy tak
whatIsThis
jestsomething
something
Musimy wiedzieć, które
directives: [...]
są określone w metadanych komponentu / dyrektywy, aby mentalnie interpretować HTML. A kiedy zapomnimy umieścić coś wdirectives
tablicy, czuję, że ta dwuznaczność utrudnia debugowanie.źródło
Masz w swoim module
musisz wyeksportować moduł RouteModule
przykład:
aby mieć dostęp do funkcji dla wszystkich, którzy importują ten moduł.
źródło
Wypróbowałem wszystkie metody, które są wymienione powyżej, ale żadna metoda nie działa dla mnie. W końcu mam rozwiązanie dla powyższego problemu i działa dla mnie.
Próbowałem tej metody:
W HTML:
W pliku TS:
źródło
W moim przypadku zaimportowałem RouterModule do modułu aplikacji, ale nie zaimportowałem go do mojego modułu funkcji. Po zaimportowaniu modułu routera do modułu EventModule błąd znika.
źródło
Jeśli otrzymujesz ten błąd podczas testowania jednostki, napisz to.
źródło
Naprawdę doceniam odpowiedź @ raykrow, gdy ten problem występuje tylko w pliku testowym! Właśnie tam go spotkałem.
Ponieważ często pomocne jest posiadanie innego sposobu wykonania kopii zapasowej, chciałem wspomnieć o tej technice, która również działa (zamiast importowania
RouterTestingModule
):(Zazwyczaj używa się go
routerLink
na<a>
elemencie, ale odpowiednio dostosowuje selektor dla innych komponentów.)Drugim powodem, dla którego chciałem wspomnieć o tym alternatywnym rozwiązaniu, jest to, że chociaż dobrze mi to służyło w wielu plikach specyfikacji, w jednym przypadku napotkałem problem:
Nie mogłem do końca zrozumieć, w jaki sposób ten kpina i ja
ButtonComponent
używaliśmy tego samego selektora, więc poszukiwanie alternatywnego podejścia doprowadziło mnie tutaj do rozwiązania @ raykrow.źródło
Jeśli korzystasz z modułów współdzielonych, po prostu dodaj RouterModule do modułu, w którym deklarowany jest twój komponent i nie zapomnij go dodać
<router-outlet></router-outlet>
Odwołany tutaj RouterLink nie działa
źródło
Moje rozwiązanie jest proste. Używam [href] zamiast [routerLink]. Wypróbowałem wszystkie rozwiązania dla [routerLink]. Żadne z nich nie działa w moim przypadku.
Oto moje rozwiązanie:
Następnie zapisz
getPlanUrl
funkcję w pliku TS.źródło