Очевидно, что бета-версия для Angular2 новее, чем новая, поэтому информации там немного, но я пытаюсь сделать то, что я считаю довольно простой маршрутизацией.
Использование кода быстрого запуска и других фрагментов с веб-сайта https://angular.io привело к следующей структуре файлов:
angular-testapp/
app/
app.component.ts
boot.ts
routing-test.component.ts
index.html
Файлы заполняются следующим образом:
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 { }
маршрутизации-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 { }
Попытка запустить этот код приводит к ошибке:
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
Я нашел смутно связанную проблему здесь; директивы router-link не работают после обновления до angular2.0.0-beta.0 . Тем не менее, «рабочий пример» в одном из ответов основан на пре-бета-коде, который вполне может работать, но я хотел бы знать, почему созданный мною код не работает.
Любые указатели будут с благодарностью приняты!
directives: [ROUTER_DIRECTIVES]
.@Component({selector: "app"}) @View({templateUrl: "app.html", directives: [ROUTER_DIRECTIVES, RouterLink]})
directives: [ROUTER_DIRECTIVES]
и изменением с [router-link] на [routerLink] я больше не получаю ошибку.Ответы:
> = RC.5
импортировать
RouterModule
См. также https://angular.io/guide/router> = РК-2
app.routes.ts
main.ts
<= RC.1
Ваш код отсутствует
Вы не можете использовать директивы, такие как
routerLink
илиrouter-outlet
не делая их известными вашему компоненту.Хотя в Angular2 имена директив были изменены, чтобы в них учитывался регистр символов, элементы по-прежнему используют
-
в имени, как будто<router-outlet>
они совместимы со спецификацией веб-компонентов, для которой требуется использовать-
имя пользовательских элементов.зарегистрироваться глобально
Чтобы сделать
ROUTER_DIRECTIVES
глобально доступным, добавьте этого провайдера вbootstrap(...)
:тогда больше не нужно добавлять
ROUTER_DIRECTIVES
к каждому компоненту.источник
provide(PLATFORM_DIRECTIVES, {useValue: [ROUTER_DIRECTIVES, FORM_DIRECTIVES, ETC...], multi: true})
FORM_DIRECTIVES
включеныPLATFORM_DIRECTIVES
по умолчанию уже.Для людей, которые находят это при попытке запустить тесты, потому что через
npm test
илиng test
используя карму или что-то еще. Ваш модуль .spec нуждается в специальном импорте тестирования маршрутизатора, чтобы его можно было собрать.http://www.kirjai.com/ng2-component-testing-routerlink-routeroutlet/
источник
spec
я должен был добавить это в файл. Спасибо @raykrow!RouterModule
вам нужно позвонить,forRoot
чтобы удовлетворить модуль, а затем вы должны предоставитьBASE_HREF
и ...Can't bind to 'active' since it isn't a known property of 'a'.
в нескольких моих модульных тестах и импортируюRouterTestingModule
.Слово предостережения при кодировании в Visual Studio (2013)
Я потратил 4-5 часов, пытаясь отладить эту ошибку. Я попробовал все решения, которые я нашел в StackOverflow по письму, и я все еще получил эту ошибку:
Can't bind to 'routerlink' since it isn't a known native property
Имейте в виду, Visual Studio имеет неприятную привычку автоформатирования текста при копировании / вставке кода. Я всегда получал небольшую мгновенную настройку от VS13 (верблюжий чехол исчезает).
Это:
становится:
Это небольшая разница, но достаточно, чтобы вызвать ошибку. Самое уродливое то, что эта небольшая разница просто избегала моего внимания каждый раз, когда я копировал и вставлял. По чистой случайности я увидел эту небольшую разницу и решил ее.
источник
Для> = V5
составная часть:
Для <V5
Также можно использовать
RouterLink
какdirectives
т.е.directives: [RouterLink]
, это сработало для меняисточник
В общем, всякий раз, когда вы получаете сообщение об ошибке
Can't bind to 'xxx' since it isn't a known native property
, наиболее вероятная причина - забыть указать компонент или директиву (или константу, которая содержит компонент или директиву) вdirectives
массиве метаданных. Так обстоит дело здесь.Так как вы не указали
RouterLink
или константуROUTER_DIRECTIVES
- которая содержит следующее :- в
directives
массиве, тогда когда Angular разбираетон не знает о директиве RouterLink (которая использует селектор атрибута
routerLink
). Поскольку Angular действительно знает, что это заa
элемент, он предполагает, что[routerLink]="..."
это привязка свойства дляa
элемента. Но затем он обнаруживает, чтоrouterLink
не является нативным свойствомa
элементов, и, следовательно, выдает исключение о неизвестном свойстве.Мне никогда не нравилась неоднозначность синтаксиса . То есть рассмотрим
Просто глядя на HTML, мы не можем сказать, если
whatIsThis
этоsomething
something
Мы должны знать, что
directives: [...]
указано в метаданных компонента / директивы, чтобы мысленно интерпретировать HTML. И когда мы забываем поместить что-либо вdirectives
массив, я чувствую, что эта двусмысленность усложняет отладку.источник
У вас в вашем модуле
Вы должны экспортировать модуль RouteModule
пример:
чтобы иметь доступ к функциям для всех, кто импортирует этот модуль.
источник
Я перепробовал все методы, которые упомянуты выше. Но ни один метод не работает для меня. В конце концов я получил решение для вышеупомянутой проблемы, и он работает для меня.
Я попробовал этот метод:
В HTML:
В файле TS:
источник
В моем случае я импортировал модуль RouterModule в приложение, но не импортировал его в свой функциональный модуль. После импорта модуля роутера в мой EventModule ошибка исчезает.
источник
Если вы получили эту ошибку во время модульного тестирования, напишите это.
источник
Я действительно ценю ответ @ raykrow, когда эта проблема возникает только в тестовом файле! Вот где я с этим столкнулся.
Поскольку часто полезно иметь другой способ сделать что-то в качестве резервной копии, я хотел бы упомянуть эту технику, которая также работает (вместо импорта
RouterTestingModule
):(Как правило, можно использовать
routerLink
на<a>
элементе , но отрегулировать селектор соответствующим образом для других компонентов.)Вторая причина, по которой я хотел упомянуть об этом альтернативном решении, заключается в том, что, хотя он хорошо послужил мне в ряде файлов спецификаций, я столкнулся с проблемой в одном случае:
Я не мог понять, как этот макет и я
ButtonComponent
использовали один и тот же селектор, поэтому поиск альтернативного подхода привел меня к решению @ raykrow.источник
Если вы используете общие модули, просто добавьте RouterModule в модуль, где объявлен ваш компонент, и не забудьте добавить
<router-outlet></router-outlet>
Ссылка отсюда не работает RouterLink
источник
Мое решение простое. Я использую [href] вместо [routerLink]. Я перепробовал все решения для [routerLink]. Ни один из них не работает в моем случае.
Вот мое решение:
Затем запишите
getPlanUrl
функцию в файл TS.источник