Angular2 Exception: Bilinen bir yerel özellik olmadığından 'routerLink'e bağlanamıyor


277

Angular2'nin beta sürümü yeniden daha yeni, bu yüzden orada fazla bilgi yok, ancak oldukça basit bir yönlendirme olduğunu düşündüğüm şeyi yapmaya çalışıyorum.

Https://angular.io web sitesinden hızlı başlangıç ​​kodu ve diğer snippet'lerle hackleme , aşağıdaki dosya yapısıyla sonuçlandı:

angular-testapp/
    app/
        app.component.ts
        boot.ts
        routing-test.component.ts
    index.html

Dosyalar aşağıdaki gibi doldurulur:

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 { }

Yönlendirme-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 { }

Bu kodu çalıştırmayı denemek hatayı oluşturur:

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

Burada belirsiz bir ilişki buldum; açısal 2.0.0-beta.0 sürümüne yükselttikten sonra yönlendirici bağlantı yönergeleri bozuldu . Ancak, cevaplardan birinde "çalışma örneği" beta-koduna dayanmaktadır - ki bu hala işe yarayabilir, ancak oluşturduğum kodun neden çalışmadığını bilmek istiyorum.

Herhangi bir işaretçi minnetle alınır!


4
Diğer soru birşeyler farklı vardır: directives: [ROUTER_DIRECTIVES].
Eric Martinez

1
ROUTER_DIRECTIVES ile bile aynı hatayı alıyorum. @Component({selector: "app"}) @View({templateUrl: "app.html", directives: [ROUTER_DIRECTIVES, RouterLink]})
phil

8
Eklenmesiyle birlikte directives: [ROUTER_DIRECTIVES][routerLink] Artık hatası alıyorum ve [yönlendirici-link] değişen.
phil

Yanıtlar:


392

> = RC.5

içe RouterModule Ayrıca bkz https://angular.io/guide/router

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

> = RC.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]);

<= RC.1

Kodunuz eksik

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

Bileşeniniz tarafından bilinmesi routerLinkveya bildirilmemesi gibi yönergeleri kullanamazsınız router-outlet.

Yönerge adları Angular2'de büyük / küçük harfe duyarlı olacak şekilde değiştirilirken, öğeler yine de adda özel öğeler adına a gerektiren web bileşenleri spesifikasyonu ile uyumlu olmak -ister .<router-outlet>-

küresel kayıt

Yapmak ROUTER_DIRECTIVESGlobal olarak kullanılabilir için bu sağlayıcıyı aşağıdakilere ekleyin bootstrap(...):

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

artık ROUTER_DIRECTIVESher bir bileşene eklemek gerekmez .


1
evet çok böyle gibi app önyükleme sırasında birden fazla direktif atayabilirsiniz: -provide(PLATFORM_DIRECTIVES, {useValue: [ROUTER_DIRECTIVES, FORM_DIRECTIVES, ETC...], multi: true})
Pardeep Jain

1
Bu doğru, ancak zaten varsayılan FORM_DIRECTIVESolarak dahil edilmiştir PLATFORM_DIRECTIVES.
Günter Zöchbauer

2
Bu harikaydı, teşekkürler. Hepsini bir araya getirmeye çalışırken de yararlı buldum: stackoverflow.com/questions/34391790/…
Jeff

Belki burada aptalca bir soru, ama burada RC.1, RC.2 nedir? Açısal 2.1.2 kullanıyorum, hangi RC?
Jian Chen

1
@AlexanderMills yaşlılar neden sizi korkutuyor? Eski cevaplar savaş testinden
geçiyor

116

Karma ya da başka bir yöntemle ya npm testda ng testkullanarak testler yapmaya çalışırken bunu bulan insanlar için . .Spec modülünüzün oluşturulabilmesi için özel bir yönlendirici testi içe aktarması gerekir.

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

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

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


2
Bu harika bir yakalama! Projem normal işlemle ilgili herhangi bir sorun yaşamıyordu, specdosyayı eklemek zorunda kaldım. Teşekkürler @raykrow!
kbpontius

1
Açısal 4'te de çalıştığı onaylandı. Bunun için teşekkürler!
JCisar

Bu kabul cevap olmalı, kabul cevabı aktarırken, çünkü yanlış RouterModule, o zaman çağırmanız gerekir forRootmodülünü tatmin etmek ve daha sonra vermelidir BASE_HREF... ve
Milad

1
Angular 5+ için bunun farklı olup olmadığı hakkında bir fikriniz var mı? Can't bind to 'active' since it isn't a known property of 'a'.Bazı birim testlerimde benzer bir hata alıyorum ve içe aktardım RouterTestingModule.
Stuart Updegrave

25

Visual Studio ile kodlarken dikkat edilmesi gereken sözcük (2013)

Bu hatayı hata ayıklamaya çalışırken 4 ila 5 saat harcadım. Ben StackOverflow mektupta buldum tüm çözümleri denedim ve hala bu hatayı aldım:Can't bind to 'routerlink' since it isn't a known native property

Unutmayın, Visual Studio, kodu kopyaladığınızda / yapıştırdığınızda otomatik biçimlendirme alışkanlığına sahiptir. VS13'ten her zaman küçük bir ayar aldım (deve kılıfı kaybolur).

Bu:

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

Oluyor:

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

Küçük bir fark, ancak hatayı tetiklemek için yeterli. En çirkin kısım, bu küçük farkın her kopyalayıp yapıştırdığımda dikkatimden kaçınmaya devam etmesiydi. Şans eseri, bu küçük farkı gördüm ve çözdüm.


4
Teşekkür ederiz, "routerlink" ile "routerLink" arasındaki farktan söz etmiş olabilirsiniz. Açısal 2, "routerLink" in mevcut olmasını bekliyor ancak "routerlink" i buluyor
Narendran Solai Sridharan

Teşekkür ederim, nedense, bazı öğretici arasında çizgi ile "yönlendirici bağlantı" kullanılır. Ancak routerLink doğru sürümdür.
windmaomao

Aynı şey webpack ve html-minifier için de geçerlidir, ancak sadece üretimde. CaseSensitive ekleyin: Gerçek seçenekler bkz html-yükleyici için: github.com/SamanthaAdrichem/webpack-3.9.1-splitted-config-an gular çalışan bir açısal 5 + webpack 3.9 yapılandırma için
Samantha Adrichem

12

> = V5 için

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

const appRoutes: Routes = [
  {path:'routing-test', component: RoutingTestComponent}
];

@NgModule({
  imports: [
    RouterModule.forRoot(appRoutes)
    // other imports here
  ]
})

bileşen:

@Component({
    selector: 'my-app',
    template: `
        <h1>Component Router</h1>
        <a routerLink="/routing-test" routerLinkActive="active">Routing Test</a>
        <router-outlet></router-outlet>
        `
})

<V5 için

Ayrıca RouterLinkbir directivesie olarak kullanabilirsiniz . directives: [RouterLink]. benim için çalıştı

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

Bunun artık geçerli olduğunu sanmıyorum (Açısal 5) vb.
Alexander Mills

10

Genel olarak, böyle bir hata aldığınızda Can't bind to 'xxx' since it isn't a known native property, en olası neden directivesmeta veri dizisinde bir bileşen veya yönerge (veya bileşen veya yönerge içeren bir sabit) belirtmeyi unutmaktır . Burada durum böyle.

Belirttiğiniz RouterLinkveya sabit olmadığından ROUTER_DIRECTIVES- aşağıdakileri içerir :

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

- directivesdizide, ardından Açısal ayrıştığında

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

hakkında bilmiyor RouterLink yönergesini ( öznitelik seçiciyi kullanıyor routerLink). Açısal aöğenin ne olduğunu bildiğinden, öğe [routerLink]="..."için bir özellik bağlayıcı olduğunu varsayar a. Ancak daha sonra bunun öğelerin routerLinkyerel bir özelliği olmadığını keşfeder a, bu nedenle bilinmeyen özellik hakkındaki istisnayı atar.


Sözdiziminin belirsizliğini hiç sevmedim . Yani, düşün

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

Sadece HTML'ye bakarak whatIsThis,

  • yerel bir özelliği something
  • bir direktifin öznitelik seçici
  • giriş özelliği something

Hangisini bilmek zorundayız directives: [...]HTML'yi zihinsel olarak yorumlamak için bileşenin / direktifin meta verilerinde belirtildiğini . Ve directivesdiziye bir şey koymayı unuttuğumuzda , bu belirsizliğin hata ayıklamayı biraz zorlaştırdığını hissediyorum.


7

Modülünüzde var

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

RouteModule modülünü dışa aktarmanız gerekir

misal:

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

bu modülü ithal eden herkesin işlevlerine erişebilme.


5

Yukarıda belirtilen tüm yöntemleri denedim.Ancak hiç kimse benim için çalışmıyor. Yukarıdaki sorun için çözüm buldum ve benim için çalışıyor.

Bu yöntemi denedim:

Html'de:

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

TS dosyasında:

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

4

Benim durumumda , Uygulama modülünde RouterModule'u içe aktardım , ancak özellik modülüme aktarmadım . EventModule'a yönlendirici modülünü içe aktardıktan sonra hata giderilir.

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 {

 }

3

Birim testi sırasında bu hatayı alıyorsanız, lütfen bunu yazın.

import { RouterTestingModule } from '@angular/router/testing';
beforeEach(async(() => {
  TestBed.configureTestingModule({
   imports: [RouterTestingModule],
   declarations: [AppComponent],
 });
}));

0

Sadece bir test dosyasında bu sorun olduğunda @ raykrow'un cevabını gerçekten takdir ediyorum! İşte burada karşılaştım.

Bir şeyi yedek olarak yapmanın başka bir yoluna sahip olmak genellikle yararlı olduğundan, aynı zamanda (içe aktarmak yerine RouterTestingModule) de çalışan bu teknikten bahsetmek istedim :

import { MockComponent } from 'ng2-mock-component';
. . .
TestBed.configureTestingModule({
  declarations: [
    MockComponent({
      selector: 'a',
      inputs: [ 'routerLink', 'routerLinkActiveOptions' ]
    }),
    . . .
  ]

(Tipik olarak, bir kullanmak routerLinkbir on<a> eleman ancak seçici diğer bileşenler için buna göre ayarlanır.)

Bu alternatif çözümden bahsetmek istediğim ikinci sebep, bir dizi spec dosyasında bana iyi hizmet etmesine rağmen, bir durumda onunla bir sorunla karşılaştım:

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

Bu sahte ve benim ButtonComponentaynı seçiciyi nasıl kullandıklarını tam olarak anlayamadım , bu yüzden alternatif bir yaklaşım aramak beni @ raykrow'un çözümüne götürdü.



-4

Benim çözümüm basit. [RouterLink] yerine [href] kullanıyorum. [RouterLink] için tüm çözümleri denedim. Benim durumumda hiçbiri çalışmıyor.

İşte benim çözümüm:

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

Ardından getPlanUrlişlevi TS dosyasına yazın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.