Di sini digunakan pathmatch sebagai full dan ketika saya menghapus pathmatch ini bahkan tidak memuat aplikasi atau menjalankan proyek
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpModule } from '@angular/http';
import { RouterModule } from '@angular/router';
import { AppComponent } from './app.component';
import { WelcomeComponent } from './home/welcome.component';
/* Feature Modules */
import { ProductModule } from './products/product.module';
@NgModule({
imports: [
BrowserModule,
HttpModule,
RouterModule.forRoot([
{ path: 'welcome', component: WelcomeComponent },
{ path: '', redirectTo: 'welcome', pathMatch: 'full' },
{ path: '**', redirectTo: 'welcome', pathMatch: 'full' }
]),
ProductModule
],
declarations: [
AppComponent,
WelcomeComponent
],
bootstrap: [ AppComponent ]
})
export class AppModule { }
angular
typescript
angular-router
Chanaka Amarasinghe
sumber
sumber
Ref: https://angular.io/guide/router#set-up-redirects
pathMatch: 'full'
artinya, seluruh jalur URL harus cocok dan digunakan oleh algoritme pencocokan rute.pathMatch: 'prefix'
artinya, rute pertama yang jalurnya cocok dengan awal URL dipilih, tetapi kemudian algoritme pencocokan rute terus mencari rute turunan yang cocok di mana sisa URL cocok.sumber
Meskipun secara teknis benar, jawaban lain akan mendapat manfaat dari penjelasan tentang pencocokan URL-ke-rute Angular. Saya tidak berpikir Anda dapat sepenuhnya (memaafkan permainan kata-kata) memahami apa yang
pathMatch: full
terjadi jika Anda tidak tahu cara kerja router di tempat pertama.Mari kita definisikan beberapa hal dasar. Kami akan menggunakan URL ini sebagai contoh:
/users/james/articles?from=134#section
.Mungkin sudah jelas, tetapi pertama-tama mari kita tunjukkan bahwa parameter kueri (
?from=134
) dan fragmen (#section
) tidak memainkan peran apa pun dalam pencocokan jalur . Hanya url dasar (/users/james/articles
) yang penting.Angular membagi URL menjadi beberapa segmen . Segmen dari
/users/james/articles
are, tentu sajausers
,james
danarticles
.Konfigurasi router adalah struktur pohon dengan simpul akar tunggal. Setiap
Route
objek adalah node, yang mungkin memilikichildren
node, yang pada gilirannya mungkin memiliki node lainchildren
atau node daun.Tujuan dari perute adalah untuk menemukan cabang konfigurasi perute , dimulai dari simpul akar, yang akan cocok dengan semua (!!!) segmen dari URL. Ini penting! Jika Angular tidak menemukan cabang konfigurasi rute yang bisa cocok dengan seluruh URL - tidak lebih dan tidak kurang - itu tidak akan merender apapun .
Misalnya, jika URL target Anda adalah
/a/b/c
tetapi router hanya dapat mencocokkan salah satu/a/b
atau/a/b/c/d
, maka tidak ada kecocokan dan aplikasi tidak akan merender apa pun.Akhirnya, rute dengan
redirectTo
berperilaku sedikit berbeda dari rute biasa, dan menurut saya rute tersebut akan menjadi satu-satunya tempat di mana orang benar-benar ingin menggunakannyapathMatch: full
. Tapi kita akan membahasnya nanti.prefix
Pencocokan jalur default ( )Alasan di balik nama tersebut
prefix
adalah bahwa konfigurasi rute seperti itu akan memeriksa apakah yang dikonfigurasipath
adalah awalan dari segmen URL yang tersisa. Namun, router hanya dapat mencocokkan segmen penuh , yang membuat penamaan ini sedikit membingungkan.Bagaimanapun, katakanlah ini adalah konfigurasi router level root kami:
const routes: Routes = [ { path: 'products', children: [ { path: ':productID', component: ProductComponent, }, ], }, { path: ':other', children: [ { path: 'tricks', component: TricksComponent, }, ], }, { path: 'user', component: UsersonComponent, }, { path: 'users', children: [ { path: 'permissions', component: UsersPermissionsComponent, }, { path: ':userID', children: [ { path: 'comments', component: UserCommentsComponent, }, { path: 'articles', component: UserArticlesComponent, }, ], }, ], }, ];
Perhatikan bahwa setiap
Route
objek di sini menggunakan strategi pencocokan default, yaituprefix
. Strategi ini berarti bahwa router melakukan iterasi ke seluruh pohon konfigurasi dan mencoba mencocokkannya dengan segmen URL target dengan segmen sampai URL benar - benar cocok . Begini cara melakukannya untuk contoh ini:users
.'products' !== 'users'
, jadi lewati cabang itu. Perhatikan bahwa kami menggunakan pemeriksaan kesetaraan daripada.startsWith()
atau.includes()
- hanya pencocokan segmen penuh yang dihitung!:other
cocok dengan nilai apa pun, jadi cocok. Namun, URL target belum sepenuhnya cocok (kami masih perlu mencocokkanjames
danarticles
), sehingga router mencari turunan.:other
yaitutricks
, yang!== 'james'
, maka tidak cocok.'user' !== 'users
, lewati cabang.'users' === 'users
- Segmennya cocok. Namun, ini belum full match, oleh karena itu kita perlu mencari anak-anak (sama seperti di langkah 3).'permissions' !== 'james'
, Lewati.:userID
cocok dengan apa pun, sehingga kami memiliki kecocokan untukjames
segmen tersebut. Namun ini masih belum full match, oleh karena itu kami perlu mencari anak yang mau cocokarticles
.:userID
memiliki rute anakarticles
, yang memberi kita pertandingan penuh! Dengan demikian aplikasi membuatUserArticlesComponent
.full
Pencocokan URL lengkap ( )Contoh 1
Bayangkan sekarang
users
objek konfigurasi rute terlihat seperti ini:{ path: 'users', component: UsersComponent, pathMatch: 'full', children: [ { path: 'permissions', component: UsersPermissionsComponent, }, { path: ':userID', component: UserComponent, children: [ { path: 'comments', component: UserCommentsComponent, }, { path: 'articles', component: UserArticlesComponent, }, ], }, ], }
Perhatikan penggunaan
pathMatch: full
. Jika ini masalahnya, langkah 1-5 akan sama, namun langkah 6 akan berbeda:'users' !== 'users/james/articles
- segmen tidak cocok karena konfigurasi jalurusers
denganpathMatch: full
tidak cocok dengan URL lengkap, yaituusers/james/articles
.Contoh 2
Bagaimana jika kita memiliki ini sebagai gantinya:
{ path: 'users/:userID', component: UsersComponent, pathMatch: 'full', children: [ { path: 'comments', component: UserCommentsComponent, }, { path: 'articles', component: UserArticlesComponent, }, ], }
users/:userID
pathMatch: full
hanya dengan kecocokanusers/james
sehingga tidak ada kecocokan sekali lagi, dan aplikasi tidak menampilkan apa pun.Contoh 3
Mari pertimbangkan ini:
{ path: 'users', children: [ { path: 'permissions', component: UsersPermissionsComponent, }, { path: ':userID', component: UserComponent, pathMatch: 'full', children: [ { path: 'comments', component: UserCommentsComponent, }, { path: 'articles', component: UserArticlesComponent, }, ], }, ], }
Pada kasus ini:
'users' === 'users
- Segmennya cocok, tetapijames/articles
tetap tidak tertandingi. Ayo cari anak-anak.'permissions' !== 'james'
- lewati.:userID'
hanya dapat mencocokkan satu segmen, yaitujames
. Namun, ini adalahpathMatch: full
rute, dan harus cocokjames/articles
(seluruh URL yang tersisa). Itu tidak dapat melakukan itu dan karenanya itu bukan pertandingan (jadi kami melewatkan cabang ini)!Seperti yang mungkin Anda perhatikan,
pathMatch: full
konfigurasi pada dasarnya mengatakan ini:Pengalihan
Semua
Route
yang telah menetapkan aredirectTo
akan dicocokkan dengan URL target sesuai dengan prinsip yang sama. Satu-satunya perbedaan di sini adalah pengalihan diterapkan segera setelah segmen cocok . Artinya jika rute pengalihan menggunakanprefix
strategi default , kecocokan parsial sudah cukup untuk menyebabkan pengalihan . Inilah contoh yang bagus:const routes: Routes = [ { path: 'not-found', component: NotFoundComponent, }, { path: 'users', redirectTo: 'not-found', }, { path: 'users/:userID', children: [ { path: 'comments', component: UserCommentsComponent, }, { path: 'articles', component: UserArticlesComponent, }, ], }, ];
Untuk URL awal kita (
/users/james/articles
), inilah yang akan terjadi:'not-found' !== 'users'
- Lewati.'users' === 'users'
- kita ada pertandingan.redirectTo: 'not-found'
, yang segera diterapkan .not-found
.not-found
. Aplikasi membuatNotFoundComponent
.Sekarang pertimbangkan apa yang akan terjadi jika
users
rute tersebut juga memilikipathMatch: full
:const routes: Routes = [ { path: 'not-found', component: NotFoundComponent, }, { path: 'users', pathMatch: 'full', redirectTo: 'not-found', }, { path: 'users/:userID', children: [ { path: 'comments', component: UserCommentsComponent, }, { path: 'articles', component: UserArticlesComponent, }, ], }, ];
'not-found' !== 'users'
- Lewati.users
akan cocok dengan segmen pertama dari URL, tetapi konfigurasi rute membutuhkanfull
kecocokan, jadi lewati saja.'users/:userID'
korek apiusers/james
.articles
masih belum cocok tapi rute ini punya anak.articles
anak-anak. Seluruh URL sekarang cocok dan aplikasi ditampilkanUserArticlesComponent
.Jalur kosong (
path: ''
)Jalur kosong adalah kasus khusus karena dapat mencocokkan segmen apa pun tanpa "mengonsumsinya" (jadi turunannya harus mencocokkan segmen itu lagi). Pertimbangkan contoh ini:
const routes: Routes = [ { path: '', children: [ { path: 'users', component: BadUsersComponent, } ] }, { path: 'users', component: GoodUsersComponent, }, ];
Katakanlah kita mencoba mengakses
/users
:path: ''
akan selalu cocok, sehingga rutenya cocok. Namun, seluruh URL belum cocok - kami masih harus cocokusers
!users
, yang cocok dengan segmen yang tersisa (dan hanya!) Dan kita memiliki kecocokan penuh. Aplikasi membuatBadUsersComponent
.Sekarang kembali ke pertanyaan awal
OP menggunakan konfigurasi router ini:
const routes: Routes = [ { path: 'welcome', component: WelcomeComponent, }, { path: '', redirectTo: 'welcome', pathMatch: 'full', }, { path: '**', redirectTo: 'welcome', pathMatch: 'full', }, ];
Jika kita menavigasi ke root URL (
/
), berikut cara router menyelesaikannya:welcome
tidak cocok dengan segmen kosong, jadi lewati saja.path: ''
cocok dengan segmen kosong. Ini memilikipathMatch: 'full'
, yang juga terpenuhi karena kami telah mencocokkan seluruh URL (memiliki satu segmen kosong).welcome
terjadi dan aplikasi ditampilkanWelcomeComponent
.Bagaimana jika tidak ada
pathMatch: 'full'
?Sebenarnya, orang akan berharap semuanya berperilaku persis sama. Namun, Angular secara eksplisit mencegah konfigurasi seperti itu (
{ path: '', redirectTo: 'welcome' }
) karena jika Anda meletakkan ini diRoute
ataswelcome
, itu secara teoritis akan membuat loop pengalihan tanpa akhir. Jadi Angular hanya membuat kesalahan , itulah sebabnya aplikasi tidak berfungsi sama sekali! ( https://angular.io/api/router/Route#pathMatch )Sebenarnya, ini tidak terlalu masuk akal bagi saya karena Angular juga telah menerapkan perlindungan terhadap pengalihan tanpa akhir seperti itu - ia hanya menjalankan satu pengalihan per tingkat perutean! Ini akan menghentikan semua pengalihan lebih lanjut (seperti yang akan Anda lihat pada contoh di bawah).
Tentang apa
path: '**'
?path: '**'
akan benar-benar cocok dengan apa pun (af/frewf/321532152/fsa
adalah pertandingan) dengan atau tanpapathMatch: 'full'
.Juga, karena cocok dengan semuanya, jalur root juga disertakan, yang membuatnya
{ path: '', redirectTo: 'welcome' }
benar-benar mubazir dalam penyiapan ini.Lucunya, tidak masalah untuk memiliki konfigurasi ini:
const routes: Routes = [ { path: '**', redirectTo: 'welcome' }, { path: 'welcome', component: WelcomeComponent, }, ];
Jika kita menavigasi ke
/welcome
,path: '**'
akan menjadi pertandingan dan pengalihan untuk menyambut akan terjadi. Secara teoritis ini harus memulai loop pengalihan tanpa akhir tetapi Angular segera menghentikannya (karena perlindungan yang saya sebutkan sebelumnya) dan semuanya berfungsi dengan baik.sumber
Ignore my children and only match me. If I am not able to match all of the remaining URL segments myself, then move on.
Dimana seperti pada pencocokan jalur lengkap dari bagian Pengalihan yang Anda sebutkanWe find a match for articles in the children. The whole URL is now matched and the application renders UserArticlesComponent.
Dari apa yang saya pahami seharusnya tidak cocok di Reidrect juga?ignore my children
sendiri yang memberikan penjelasannya. Keraguan ini adalah cara pengembang Angular melihatnya, tetapi ini adalah salah satu prinsippathMatch: 'full'
. Jadi dalam contoh pengalihan yang Anda maksud, pemberitahuan yangpathMath: 'full'
diterapkan ke rute kedua (path: 'users'
), yang, karena itu, tidak cocok. Rute yang cocok adalahpath: 'users/:userID'
, yang tidak menggunakanpathMatch: 'full'
dan bekerja seperti biasa. Jadi pertama-tama cocokusers/james
dan kemudian kita cariarticles
pada anak-anaknya (sekali lagi, tidak digunakanpathMatch: 'full'
).Strategi pencocokan jalur, salah satu dari 'awalan' atau 'penuh'. Default-nya adalah 'awalan'.
Secara default, router memeriksa elemen URL dari kiri untuk melihat apakah URL cocok dengan jalur yang diberikan, dan berhenti jika ada kecocokan. Misalnya, '/ tim / 11 / pengguna' cocok dengan 'tim /: id'.
Strategi pencocokan jalur 'penuh' cocok dengan seluruh URL. Hal ini penting untuk dilakukan saat mengarahkan rute jalur kosong. Jika tidak, karena jalur kosong adalah awalan dari URL apa pun, router akan menerapkan pengalihan bahkan saat menavigasi ke tujuan pengalihan, membuat loop tanpa akhir.
Sumber: https://angular.io/api/router/Route#properties
sumber