Angular2 Исключение: не удается привязать к 'routerLink', поскольку это не известное свойство native

Очевидно, что бета для 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>
        "): [email protected]:11

Я нашел здесь неопределенную проблему; директивы router-link после обновления до angular2.0.0-beta.0. Однако "рабочий пример" в одном из ответов основан на предварительном бета-коде, который может все еще работать, но я хотел бы знать, почему созданный мной код не работает.

Любые указатели будут с благодарностью приняты!

Ответ 1

>= RC.5

импортируйте RouterModule См. Также https://angular.io/docs/ts/latest/guide/router.html

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

>= РК-2

app.routes.ts

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

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

export const APP_ROUTER_PROVIDERS = [provideRouter(routes)];

main.ts

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

bootstrap(AppComponent, [APP_ROUTER_PROVIDERS]);

<= РК-1

Ваш код отсутствует

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

Вы не можете использовать директивы типа routerLink или router-outlet, не сообщая их своему компоненту.

В то время как имена директив были изменены для чувствительности к регистру в Angular2, элементы по-прежнему используют - в имени типа <router-outlet> для совместимости с спецификацией веб-компонентов, для которой требуется - во имя пользовательские элементы.

зарегистрировать глобально

Чтобы сделать доступным ROUTER_DIRECTIVES глобально доступным, добавьте этого провайдера в bootstrap(...):

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

то больше не нужно добавлять ROUTER_DIRECTIVES к каждому компоненту.

Ответ 2

Для тех, кто находит это при попытке запуска тестов, потому что через npm test или ng test используется Karma или что-то еще. Для вашего модуля .spec требуется специальный импорт проб для импорта маршрутизатора.

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

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

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

Ответ 3

Осторожность при кодировании с помощью Visual Studio (2013)

Я потратил 4-5 часов, пытаясь отладить эту ошибку. Я пробовал все решения, которые я нашел в stackoverflow по письму, и я до сих пор получил эту ошибку: Can't bind to 'routerlink' since it isn't a known native property

Помните, что Visual Studio имеет неприятную привычку форматировать текст при копировании/вставке кода. Я всегда получал небольшую мгновенную настройку от VS13 (случай верблюда исчезает).

Это:

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

становится:

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

Это небольшая разница, но достаточно, чтобы вызвать ошибку. Самая уродливая часть заключается в том, что эта небольшая разница просто избегала моего внимания каждый раз, когда я копировал и вставлял. По чистой случайности я увидел эту небольшую разницу и решил ее.

Ответ 4

В общем случае всякий раз, когда вы получаете ошибку, например Can't bind to 'xxx' since it isn't a known native property, наиболее вероятной причиной является забывание указать компонент или директиву (или константу, которая содержит компонент или директиву) в массиве метаданных directives. Вот здесь.

Поскольку вы не указали RouterLink или константу ROUTER_DIRECTIVES – который содержит следующее:

export const ROUTER_DIRECTIVES = [RouterOutlet, RouterLink, RouterLinkWithHref, 
  RouterLinkActive];

– в массиве directives, затем, когда Angular анализирует

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

он не знает о директиве RouterLink (который использует селектор атрибутов RouterLink). Поскольку Angular знает, что такое элемент a, он предполагает, что [routerLink]="..." является связыванием свойств для элемента a. Но затем обнаруживается, что RouterLink не является собственным свойством элементов a, поэтому он выдает исключение из неизвестного свойства.


Мне никогда не нравилась двусмысленность синтаксиса. I.e, рассмотрим

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

Просто взглянув на HTML, мы не можем определить, есть ли whatIsThis

  • собственное свойство something
  • селектор атрибутов директивы
  • входное свойство something

Мы должны знать, какие directives: [...] указаны в метаданных компонента/директивы, чтобы мысленно интерпретировать HTML. И когда мы забываем что-то помещать в массив directives, я чувствую, что эта двусмысленность затрудняет отладку.

Ответ 5

Также можно использовать RouterLink как directives т.е. directives: [RouterLink]. который работал у меня

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},
])

Ответ 6

У вас в вашем модуле

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

вам нужно экспортировать модуль RouteModule

Пример:

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

чтобы иметь возможность доступа к функциям для всех, кто импортирует этот модуль.

Ответ 7

Я пробовал все методы, о которых упоминалось выше. Но ни один метод не работает для меня. Наконец-то я получил решение для вышеупомянутой проблемы, и он работает для меня.

Я пробовал этот метод:

В Html:

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

В файле TS:

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

Ответ 8

В моем случае я импортировал RouterModule в боксе модуля приложения, который не импортируется в мой функциональный модуль. После импорта модуля маршрутизатора в моем EventModule ошибка исчезнет.

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 {

 }

Ответ 9

Мое решение простое. Я использую [href] вместо [routerLink]. Я пробовал все решения для [routerLink]. Ни один из них не работает в моем случае.

Вот мое решение:

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

Затем напишите функцию getPlanUrl в файле TS.