Jelas beta untuk Angular2 lebih baru daripada yang baru, jadi tidak ada banyak informasi di luar sana, tapi saya mencoba melakukan apa yang saya pikir merupakan beberapa rute yang cukup mendasar.
Meretas dengan kode mulai cepat dan cuplikan lainnya dari situs web https://angular.io telah menghasilkan struktur file berikut:
angular-testapp/
app/
app.component.ts
boot.ts
routing-test.component.ts
index.html
Dengan file yang sedang diisi sebagai berikut:
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 { }
Mencoba menjalankan kode ini menghasilkan kesalahan:
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
Saya menemukan masalah yang samar-samar terkait di sini; arahan router-link rusak setelah memutakhirkan ke angular2.0.0-beta.0 . Namun, "contoh kerja" di salah satu jawaban didasarkan pada kode pra-beta - yang mungkin masih berfungsi, tetapi saya ingin tahu mengapa kode yang saya buat tidak berfungsi.
Pointer apa pun akan diterima dengan penuh syukur!
directives: [ROUTER_DIRECTIVES]
.@Component({selector: "app"}) @View({templateUrl: "app.html", directives: [ROUTER_DIRECTIVES, RouterLink]})
directives: [ROUTER_DIRECTIVES]
dan perubahan dari [router-link] ke [routerLink] saya tidak lagi mendapatkan kesalahan.Jawaban:
> = RC.5
impor
RouterModule
Lihat juga https://angular.io/guide/router> = RC.2
app.routes.ts
main.ts
<= RC.1
Kode Anda tidak ada
Anda tidak dapat menggunakan arahan seperti
routerLink
ataurouter-outlet
tanpa membuatnya diketahui oleh komponen Anda.Sementara nama direktif diubah menjadi case-sensitive di Angular2, elemen masih menggunakan
-
dalam nama ingin<router-outlet>
kompatibel dengan spesifikasi komponen web yang memerlukan-
nama elemen kustom.daftar secara global
Untuk membuat
ROUTER_DIRECTIVES
tersedia secara global, tambahkan penyedia ini kebootstrap(...)
:maka tidak perlu lagi menambahkan
ROUTER_DIRECTIVES
ke setiap komponen.sumber
provide(PLATFORM_DIRECTIVES, {useValue: [ROUTER_DIRECTIVES, FORM_DIRECTIVES, ETC...], multi: true})
FORM_DIRECTIVES
sudah termasuk dalamPLATFORM_DIRECTIVES
standar.Untuk orang yang menemukan ini ketika mencoba menjalankan tes karena melalui
npm test
ataung test
menggunakan Karma atau apa pun. Modul .spec Anda memerlukan impor pengujian router khusus untuk dapat dibuat.http://www.kirjai.com/ng2-component-testing-routerlink-routeroutlet/
sumber
spec
file yang saya harus tambahkan ini. Terima kasih @raykrow!RouterModule
, maka Anda perlu meneleponforRoot
untuk memenuhi modul dan kemudian Anda harus memberikanBASE_HREF
dan ...Can't bind to 'active' since it isn't a known property of 'a'.
di beberapa pengujian unit saya, dan telah mengimporRouterTestingModule
.Hati-hati saat coding dengan Visual Studio (2013)
Saya telah membuang waktu 4 hingga 5 jam untuk mencoba men-debug kesalahan ini. Saya mencoba semua solusi yang saya temukan di StackOverflow oleh surat itu dan saya masih mendapatkan kesalahan ini:
Can't bind to 'routerlink' since it isn't a known native property
Ketahuilah, Visual Studio memiliki kebiasaan buruk pada teks autoformatting ketika Anda menyalin / menempelkan kode. Saya selalu mendapat penyesuaian instan kecil dari VS13 (case unta menghilang).
Ini:
Menjadi:
Ini perbedaan kecil, tetapi cukup untuk memicu kesalahan. Bagian terburuk adalah perbedaan kecil ini terus menghindari perhatian saya setiap kali saya menyalin dan menempel. Secara kebetulan, saya melihat perbedaan kecil ini dan menyelesaikannya.
sumber
Untuk> = V5
komponen:
Untuk <V5
Juga bisa digunakan
RouterLink
sebagai contohdirectives
.directives: [RouterLink]
. itu berhasil untuk sayasumber
Secara umum, setiap kali Anda mendapatkan kesalahan seperti
Can't bind to 'xxx' since it isn't a known native property
, penyebab yang paling mungkin adalah lupa untuk menentukan komponen atau arahan (atau konstanta yang berisi komponen atau arahan) dalamdirectives
array metadata. Seperti halnya di sini.Karena Anda tidak menentukan
RouterLink
atau konstantaROUTER_DIRECTIVES
- yang berisi yang berikut ini :- Dalam
directives
array, lalu ketika Angular mem-parsingtidak tahu tentang direktif RouterLink (yang menggunakan pemilih atribut
routerLink
). Karena Angular tahu apaa
elemen itu, ia mengasumsikan bahwa itu[routerLink]="..."
adalah properti yang mengikat untuka
elemen tersebut. Tetapi kemudian menemukan bahwarouterLink
itu bukan properti asli daria
elemen, maka ia melemparkan pengecualian tentang properti yang tidak diketahui.Saya tidak pernah benar-benar menyukai ambiguitas sintaksis . Yaitu, pertimbangkan
Hanya dengan melihat HTML, kami tidak tahu apakah
whatIsThis
itu HTMLsomething
something
Kita harus tahu mana
directives: [...]
yang ditentukan dalam metadata komponen / direktif untuk menafsirkan secara mental HTML. Dan ketika kita lupa untuk memasukkan sesuatu ke dalamdirectives
array, saya merasa ambiguitas ini membuatnya agak sulit untuk di-debug.sumber
Anda miliki di modul Anda
Anda harus mengekspor modul RouteModule
contoh:
untuk dapat mengakses fungsi untuk semua yang mengimpor modul ini.
sumber
Saya telah mencoba semua metode, yang disebutkan di atas. Tetapi tidak ada satu metode yang berfungsi untuk saya. Akhirnya saya mendapat solusi untuk masalah di atas dan itu bekerja untuk saya.
Saya mencoba metode ini:
Dalam Html:
Dalam file TS:
sumber
Dalam kasus saya, saya telah mengimpor RouterModule dalam modul Aplikasi tetapi tidak diimpor dalam modul fitur saya. Setelah mengimpor modul router di EventModule saya kesalahan hilang.
sumber
Jika mendapatkan kesalahan ini saat pengujian unit, harap tulis ini.
sumber
Saya sangat menghargai jawaban @ raykrow ketika seseorang memiliki masalah ini hanya dalam file uji! Di situlah saya menemukannya.
Karena sering membantu memiliki cara lain untuk melakukan sesuatu sebagai cadangan, saya ingin menyebutkan teknik ini yang juga berfungsi (alih-alih mengimpor
RouterTestingModule
):(Biasanya, orang akan menggunakan
routerLink
pada<a>
elemen tetapi menyesuaikan pemilih yang sesuai untuk komponen lainnya.)Alasan kedua saya ingin menyebutkan solusi alternatif ini adalah bahwa, meskipun itu membantu saya dengan baik dalam sejumlah file spesifikasi, saya mengalami masalah dengan itu dalam satu kasus:
Saya tidak tahu bagaimana tiruan ini dan saya
ButtonComponent
menggunakan pemilih yang sama, jadi mencari pendekatan alternatif membawa saya ke sini untuk solusi @ raykrow.sumber
Jika Anda menggunakan modul bersama, cukup tambahkan RouterModule ke Modul tempat komponen Anda dideklarasikan dan jangan lupa untuk menambahkan
<router-outlet></router-outlet>
Dirujuk dari sini RouterLink tidak berfungsi
sumber
Solusi saya sederhana. Saya menggunakan [href] bukan [routerLink]. Saya telah mencoba semua solusi untuk [routerLink]. Tak satu pun dari mereka bekerja dalam kasus saya
Ini solusinya:
Kemudian tulis
getPlanUrl
fungsi di file TS.sumber